《利用python进行数据分析》第四章的程序,介绍了numpy的基本使用方法。(第三章为Ipython的基本使用)

科学计算、常用函数、数组处理、线性代数运算、随机模块……

# -*- coding:utf-8 -*-
# 《python for data analysis》第四章, numpy基础
# 数组与矢量计算
import numpy as np
import time # 开始计时
start = time.time() # 创建一个array
data = np.array([[1, 2, 3, 4, 5, 6],
[7, 8, 9, 10, 11, 12]], dtype=np.int32) # 输入类型为tuple时效果一致, 可指定数据类型,也可缺省
print('data:'),
print(data)
print('data.shape:'),
print(data.shape) # 等价于np.shape(data),(2L,6L),tuple型
print('data.dtype:'),
print(data.dtype) # 显示元素的变量类型,int32
print('type(data):'),
print(type(data)) # 显示整个array的变量类型,numpy.ndarray
print('↑---------------------class1\n\n') # 快速创建一些特殊格式的array
print(np.ones(shape=(2, 3))) # 打印一个2*3,元素全为1的矩阵
print(np.zeros(shape=(3, 2))) # 打印一个3*2,元素全为0的矩阵
print(np.empty(shape=(3, 5))) # 打印一个3*5,元素随机的矩阵
print(np.arange(0, 3)) # np.arange同python内置的range,range()产生list对象,np.arange产生array对象。 result: array([0,1,2])
print(np.eye(5)) # 创建一个五阶单位矩阵, 等同于np.identity(5)
print('↑---------------------class2\n\n') # ndarray的数据类型
# 用.astype()进行数据类型转换,int转float, 注意float转int时会截尾
print(data.dtype)
data = data.astype(np.float64)
print(data.dtype)
# string转float
data = np.array(['1.23', '2.34', '3.45'])
data = data.astype(np.float64)
print(data)
print(data.dtype)
print('↑---------------------class3\n\n') # 数组与数组、数组与标量之间的运算
# 1、数组与标量运算,将标量值按照相同的运算规则传播到数组内的各个元素
data = np.arange(1, 6)
print('data:'),
print(data)
data = data + 2
print('data+2:'),
print(data)
# 2、数组与数组运算,且两个数组的shape相同,此时任何算术运算均会应用到元素级
data1 = np.arange(1, 6)
data2 = np.ones(5).astype(np.int32)
print('\ndata1:'),
print(data1)
print('data2:'),
print(data2)
print('data1 * data2:'),
print(data1 * data2)
print('data1 + data2:'),
print(data1 + data2)
# 3、数组与数组运算,且两个数组的shape不相同,此时启用numpy的广播(broadcast)机制
# http://baijiahao.baidu.com/s?id=1580719686756248184&wfr=spider&for=pc 广播机制用图说明过程
data1 = np.arange(1, 6).reshape(-1, 1)
data2 = np.arange(1, 6)
print('\ndata1:'),
print(data1)
print('data2:'),
print(data2)
print('data1 + data2:'),
print(data1 + data2)
print('↑---------------------class4\n\n') # 基本的索引与切片
# 创建一个切片
data = np.arange(1, 10)
slice_data = data[2:5] # slice_data是data的一个切片
# ★★★★★array的切片是原array的一个视图(引用),切片上任何数据的修改都会直接反映到原array上
print(data) # [1 2 3 4 5 6 7 8 9]
print(slice_data) # [3 4 5]
slice_data[1] = 100
print(slice_data) # [ 3 100 5]
print(data) # [ 1 2 3 100 5 6 7 8 9]
# 这和list的切片规则是完全不一样的,list的切片是原list的一个复制
origin_list = range(1, 10)
slice_list = origin_list[2:5]
print(origin_list) # [1 2 3 4 5 6 7 8 9]
print(slice_list) # [3 4 5]
slice_list[1] = 100
print(slice_list) # [ 3 100 5]
print(origin_list) # [1 2 3 4 5 6 7 8 9]
# array的切片通过.copy()也可以像list那样复制数据而不是引用
data = np.arange(1, 10)
slice_data = data[2:5].copy() # slice_data是data的一个切片,复制,而不是引用
print(data) # [1 2 3 4 5 6 7 8 9]
print(slice_data) # [3 4 5]
slice_data[1] = 100
print(slice_data) # [ 3 100 5]
print(data) # [1 2 3 4 5 6 7 8 9]
# 一维数组的索引直接写入标量实现
# 二维及以上数组的索引是一个一维数组,行向量与列向量写法等价
data_2d = np.empty(shape=(3, 3))
print(data_2d[1, 2] == data_2d[1][2])
print('↑---------------------class5\n\n') # 索引方式,3种
# 1、切片索引,切片为原数组的视图,数据引用
data = np.arange(1, 6) # array([1,2,3,4,5])
data_slice = data[1:3] # array([2,3]),
print(data_slice)
data_nd = np.arange(1, 10).reshape(3, 3) # 高维数组的切片索引还可以结合整数索引混合使用
data_slice = data_nd[1, 1:] # array([5,6])
print(data_slice)
data_slice = data_nd[2, :] # array([7,8,9]) , : 表示选取整条轴
print(data_slice)
print(' ')
# 2、布尔型索引,切片为数据复制
name = np.array(['a', 'b', 'a', 'b', 'c', 'd'])
data = np.arange(1, 19).reshape(6, 3)
data_slice = data[name == 'a']
print(data)
print(data_slice)
data_slice[1] = 1 # 布尔型索引产生的子集是数据的复制而不是视图,对子集的改变不影响原数组
print(data)
print(data_slice)
data[data > 10] = 10
print(data)
data[(data == 2) | (data == 7)] = 1
print(data)
print('')
# 3、花式索引(fancy indexing),用整数数组进行索引
data = np.arange(1, 10).reshape(3, 3)
data_slice = data[[1, 2, 0]]
print(data)
print(data_slice)
data_slice[1] = 1 # 花式索引产生的子集也是数据的复制
print(data)
print(data_slice)
data_slice = data[[0, 1]][:, [0, 1]] # 花式索引还可以选中原数组的某个矩形区域,也可以写为data[np.ix_([0,1],[0,1]])]
print(data_slice)
print('↑---------------------class6\n\n') # 数据转置与轴对换
data = np.arange(1, 10).reshape(3, 3)
print(data)
data_T = data.T # 转置,也可以写为 data = data.transpose()
print(data_T)
data_T[1] = 1 # 转置返回的是原数组的视图,无数据的复制
print(data_T)
print(data)
print('↑---------------------class7\n\n') # 通用函数,对数组使用,并对其中的数据执行元素级的函数运算
# abs\square\sqrt\sign\ceil\floor\rint\mod\exp等等
data = np.arange(10)
data2 = np.sqrt(data)
print(data)
print(data2)
print('↑---------------------class8\n\n') # 条件逻辑的数组运算,用np.where来替代x if condition else y
a = np.array([1, 2, 3, 4, 5])
b = np.array([6, 7, 8, 9, 0])
condition = np.array([True, False, True, True, False])
result1 = [(a if condition else b) for a, b, condition in zip(a, b, condition)]
print(result1)
a = np.array([1, 2, 3, 4, 5])
b = np.array([6, 7, 8, 9, 0])
condition = np.array([True, False, True, True, False])
result2 = np.where(condition, a, b)
print(result2)
# np.where可用于高维数组而x if condition else y 不行
data = np.arange(9).reshape(3, 3)
data2 = np.where(data < 5, 5, data)
print(data)
print(data2)
print('↑---------------------class9\n\n') # 数组统计,通过某些函数对整个数组或数组上的某个轴进行统计
# sum、mean、std、var、min、max、argmin(最小值对应的索引)、argmax、cumsum(所有元素累计和)、cumprod(所有元素累计积)
data = np.arange(9).reshape(3, -1)
mean = data.mean() # 对整个数组取平均值
print(mean)
mean2 = data.mean(1) # 第二个轴上取平均值,即每一列的平均值
print(mean2)
cumsum = data.cumsum()
print(cumsum) # 高维会自动转为1维
print('↑--------------------class10\n\n') # 布尔型数组操作
# 布尔型数组的元素为true和false,在运算过程中,true可视为1,false可视为0
data = np.array([True, False, True, True])
print(data.sum())
# .any()用于检查array中元素是否全为0,.all()用于检查array中元素是否全为1
# .any()——有一个TRUE则返回1,反之0;.all()——全为TRUE返回1,反之0
print(data.any())
print(data.all())
# .any()、.all()对非布尔型数组进行操作时,所有非零元素视为True
data = np.array([-1, 1])
print(data.all())
print('↑--------------------class11\n\n') # 数组排序
data = np.random.randn(6)
print(data)
# 两种写法等价
# data = np.sort(data) # 用np.sort()函数时不改变原数组,需要赋值操作
data.sort() # .sort()方法自动对元素组进行操作,无需重新赋值
print(data)
# 高维数组可对某一个轴进行排序
data = np.random.randn(3, 3)
print(data)
data.sort(1) # 对第二个轴(即每行)进行排序
print(data)
print('↑--------------------class12\n\n') # 集合运算
# 数组元素唯一化
data = [1, 2, 3, 3, 3]
data = np.unique(data) # np.unique(data) 不对原数据进行去重操作,需要赋值
print(data)
# intersect1d(x,y) 返回公共元素,即交集,有序; union1d(x,y)返回并集,有序; setxor1d(x,y)返回两个集合的异或集(元素级运算)
# setdiff1d(x,y) 类似集合之差,即在x中而不在y中的元素(非对称,注意这一点)
data1 = [1, 2, 3]
data2 = [1, 3, 5]
delta = np.setdiff1d(data1, data2)
print(delta)
# in1d(x,y) 对元素级对象,返回x中每个元素是否在y中
inornot = np.in1d(data1, data2)
print(inornot)
print('↑--------------------class13\n\n') # 数据的保存与读取
data = np.arange(1, 10).reshape(3, 3)
np.save('data.npy', data) # 以二进制格式保存数组data,文件格式.npy
data2 = np.load('data.npy') # 读取,上一行的逆过程
print(data2)
data = np.random.randn(3, 3)
np.savetxt('data.txt', data, delimiter=',') # 以txt格式保存data
data2 = np.loadtxt('data.txt', delimiter=',') # 读取txt文件到data2这个数组
print(data2)
print('↑--------------------class14\n\n') # 矩阵的线性代数运算
# numpy把常用的线性代数运算放在numpy.linalg库中
data1 = np.arange(1, 10).reshape(3, 3)
data2 = np.eye(3) + np.ones((3, 3))
print(data1)
print(data2)
print('')
multiply = np.dot(data1, data2)
print(multiply)
print('')
inv = np.linalg.inv(data2) # 逆矩阵
print(inv)
print(np.dot(data2, inv))
det = np.linalg.det(data1) # 行列式
print('')
print(det) # 非满秩矩阵
lamda, x = np.linalg.eig(data2) # 求特征值(lamda)与特征向量(x)
print(x)
print(lamda)
x = x.T # 转置 再取出每一行即为各个特征值对应的特征向量
print(np.dot(data2, x[0]))
print(lamda[0] * x[0]) # 这一行与上一行结果相同,验证了A·x = lamda·x
print('')
# linalg中还有迹、QR分解、SVD分解、解线性方程、最小二乘等函数
print('↑--------------------class15\n\n') # 随机模块,np.random
# random.seed(),随机种子,使随机特性可复现
# 要指出的是,一次seed可以是整个程序的随机性均可复现,但不同地方的随机生成值不同,每次生成随机数前给定seed,则每个随机数相同
np.random.seed(0)
for i in range(5):
print(np.random.random()) # .random()生成一个随机数
print('')
for i in range(5):
np.random.seed(0)
print(np.random.randn())
print(np.random.randn(3, 3)) # .randn()按照标准正态分布生成随机值,可指定shape
for i in range(5):
print(np.random.normal(loc=50, scale=10)) # 给定均值和方差的正态分布,loc均值,scale标准差
print(np.random.permutation(10)) # 生成给定长度的随机序列
# 还有其他分布的随机数生成函数,beta()生成服从beta分布的随机数;chisquare()-卡方分布;
# gamma()-gamma分布;uniform()-[0,1)区间内的均匀分布
print('↑--------------------class16\n\n') # end
print("----------That's all----------------- \n total time is %.5f s" % (time.time() - start))

《python for data analysis》第四章,numpy的基本使用的更多相关文章

  1. 《python for data analysis》第九章,数据聚合与分组运算

    # -*- coding:utf-8 -*-# <python for data analysis>第九章# 数据聚合与分组运算import pandas as pdimport nump ...

  2. 《python for data analysis》第二章,美国1880-2010年出生人口姓名的数据分析

    <利用python进行数据分析>第二章的姓名例子,代码.整个例子的所有代码集成到了一个文件中,导致有些对象名如year同时作为了列名与行名,会打印warning,可分不同的part依次运行 ...

  3. 《利用python进行数据分析》读书笔记--第四章 numpy基础:数组和矢量计算

    http://www.cnblogs.com/batteryhp/p/5000104.html 第四章 Numpy基础:数组和矢量计算 第一部分:numpy的ndarray:一种多维数组对象 实话说, ...

  4. 《python for data analysis》第七章,数据规整化

    <利用Python进行数据分析>第七章的代码. # -*- coding:utf-8 -*-# <python for data analysis>第七章, 数据规整化 imp ...

  5. 《python for data analysis》第五章,pandas的基本使用

    <利用python进行数据分析>一书的第五章源码与读书笔记 直接上代码 # -*- coding:utf-8 -*-# <python for data analysis>第五 ...

  6. 《利用Python进行数据分析·第2版》第四章 Numpy基础:数组和矢量计算

    <利用Python进行数据分析·第2版>第四章 Numpy基础:数组和矢量计算 numpy高效处理大数组的数据原因: numpy是在一个连续的内存块中存储数据,独立于其他python内置对 ...

  7. Python for Data Analysis 学习心得(一) - numpy介绍

    一.简介 Python for Data Analysis这本书的特点是将numpy和pandas这两个工具介绍的很详细,这两个工具是使用Python做数据分析非常重要的一环,numpy主要是做矩阵的 ...

  8. 数据分析---《Python for Data Analysis》学习笔记【04】

    <Python for Data Analysis>一书由Wes Mckinney所著,中文译名是<利用Python进行数据分析>.这里记录一下学习过程,其中有些方法和书中不同 ...

  9. 数据分析---《Python for Data Analysis》学习笔记【03】

    <Python for Data Analysis>一书由Wes Mckinney所著,中文译名是<利用Python进行数据分析>.这里记录一下学习过程,其中有些方法和书中不同 ...

随机推荐

  1. python 自动化之路

    https://www.cnblogs.com/yangliheng/category/878973.html

  2. 解决Warning: mysql_connect(): Headers and client library minor version mismatch. 警告

    php -i|grep Client 查询当前Client 版本,结果如下: Client API version => 5.6.31Client API library version =&g ...

  3. Android : 高通平台Camera调试之SetpropKey/camxoverridesettings.txt

    高通相关网址:Createpoint: https://createpoint.qti.qualcomm.com(可下载文档,Release Note等)Chipcode: https://chipc ...

  4. jedis连接池参数minEvictableIdleTimeMillis和softMinEvictableIdleTimeMillis探索

    我们通常在使用JedisPoolConfig进行连接池配置的时候,minEvictableIdleTimeMillis和softMinEvictableIdleTimeMillis这两个参数经常会不懂 ...

  5. C#中五种访问修饰符作用范围 public、private、protected、internal、protected internal

    1.五种访问修饰符包括哪些? public.private.protected.internal.protected internal 2.五种访问修饰符的作用范围? public  :公有访问.不受 ...

  6. L360 Most People Spend Their Time in Just 25 Places

    Some people are always out on the town, going to concerts, restaurant openings, you name it. They're ...

  7. css 清楚浮动的几种方式

    方法一: 使用clear属性的空元素 <div style="clear:both;"></div> 方法二:使用overflow属性 给浮动的元素容器添加 ...

  8. 【原创】ACR傻瓜式破解IC芯片卡

    1.简介: 智能卡(英语:Smart card 或IC Card),又称智慧卡.聪明卡.集成电路卡及IC卡,是指粘贴或嵌有集成电路芯片的一种便携式卡片塑料.卡片包含了微处理器.I/O接口及存储器,提供 ...

  9. django + 阿里云云服务器网站搭建

    最近自己用django搭了一个小网站,个人的项目挂在了github上 https://github.com/LOMOoO/tpure 预计是挂在阿里云的云服务器上运行,云服务器买好了,阿里云的域名也买 ...

  10. H5中用postMessage传递数据,解决localStorage不能跨域问题

    localStorage不能跨域,所以在A域名下用localStorage.YourKey方式存储的值,在B域名下是不能取到的. 所以需要转变思路,目前主要使用的两种方式: 一种方式:在A.B两个页面 ...