NumPy最重要的一个特点是其N维度数组对象ndarray,用于存放相同类型元素的多维数组
1 ndarray对象
numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
2 numpy数组中比较重要的ndarray对象属性:
ndarray.ndim ndarray.shape ndarray.size ndarray.dtype ndarray.itemsize ndarray.flags 对象内存信息
ndarray.real 元素的实部 ndarray.image 元素的虚部
3 创建数组
ndarray数组处了可以使用底层ndarray构造器创建,也可以通过以下方式:
np.empty(shape, dtype=float, order='C')
np.zeros(shape, dtype=float, order='C')
np.ones(shape, dtype=float, order='C')
4 从已有的数组创建数组
numpy.asarray类似与numpy.array,但是numpy.asarray只有三个,比numpy.array少两个
numpy.asarray(object, dtype=None, order=None)
5 从数值范围创建数组
numpy.arange(start=0, stop, step=1, dtype) # np.arange(5)
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) # 等差数列
# endpoint是否包括最后一个值,retstep生成的数组是否显示间距
numpy.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None) # base是指log的下标,用于创建等比数列
6 numpy切片和索引
a = np.arange(10)
b = a[2:]; c=a[2:7:2];
切片还可以使用省略号,...,来使选择元组的长度与数组的维度相同。
a = np.array([[1,2,3], [4,5,6], [7,8,9]])
b = a[..., 1]
7 numpy高级索引
numpy除了整数和切片索引外,还有整数数组索引、布尔索引、花式索引。
整数数组索引:
x = np.array([[1, 2], [3, 4], [5, 6]])
y = x[[0, 1, 2], [0, 1, 0]] # 行索引与列索引
布尔索引:
可通过一个布尔数组来索引目标数组,布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组
x = np.array([0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]); x[x>5]
用~来过滤NaN
a = np.array([np.nan, 1, 2, np.nan, 3, 4, 5]); print(a[~np.isnan(a)])
花式索引
8 numpy广播机制
broadcast是numpy对不同形状的数组进行数值计算的方式,当两个数组形状不同时,numpy将自动触发广播机制
9 numpy迭代数组
numpy迭代器对象numpy.nditer提供了一种灵活访问一个或者多个数组元素的方式
控制遍历顺序
for x in np.nditer(a, order='F'): Fortran order,即是列序优先
for x in np.nditer(a.T, order='C'): C order,即使行序优先
修改数组中元素的值
nditer对象有可选参数op_flags。默认,nditer遍历数组只读,为了在遍历时修改数组值,需指定read-write或write-only
for x in np.nditer(a, op_flags=['readwrite']):
10 numpy数组操作
修改数组形状
reshape: 函数可以在不改变数据的条件下修改形状
flat: 是一个数组元素迭代器,数组的修改会影响原始数组
flatten: 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组
ravel: 展平的数组元素,顺序通常是‘C风格’,修改会影响原始数组
flatten('C')与flatten('F'),ravel('C')与ravel('F')
翻转数组
transpose, 对换数组的维度; ndarray.T, 与transpose相同; rollaxis, 向后滚动指定的轴; swapaxes, 用于交换数组的两个轴
修改数组维度
broadcast broadcast_to expand_dims squeeze
np.broadcast(x, y)
np.broadcast_to(array, shape)
连接数组
numpy.concatenate((a1, a2, ...), axis) 用于沿指定轴连接相同形状的两个或多个数组
np.stack((a, b), axis) 用于沿新轴连接数组序列
np.hstack 通过水平堆叠来生成数组
np.vstack通过垂直堆叠来生成数组
分割数组
split 将一个数组分割为多个子数组
np.split(array, indices_or_sections, axis) indices_or_sections如果是一个整数,则用该整数平均分,如果是一个数组,为沿轴切分的位置
np.hsplit 将一个数组水平分割为多个子数组
np.vsplit 将一个数组垂直分割为多个子数组
数组元素的添加与删除
resize, append, insert, delete, unique
11 numpy数学函数
三角函数
sin(), cos(), tan()
a = np.array([0, 30, 45, 60, 90]); np.sin(a*np.pi/180)
舍入函数
np.around() 返回指定数字的四舍五入值 np.floor() np.ceil()
算术函数
add(), subtract(), divide() 数组必须具有相同的形状,或符合数组广播规则
np.reciprocal() 函数返回参数逐元素的倒数
np.power() np.power(a, 2)
np.mode() 计算输入数组中相应元素的相除后的余数,np.remainder()产生相同的结果
a = np.array([10, 20, 30]); b = np.array([3, 5, 7]); np.mod(a, b)
统计函数
统计函数,用于从数组中查找最小元素,最大元素,百分位标准差和方差
np.max(array, axis) np.min() np.ptp() 计算数组中元素最大值和最小值的差 np.median()
np.mean() 返回数组中元素的算术平均值,如果提供了轴,则沿其计算
np.average() 函数根据在另一个数组中给出的各自的权重计算数组元素的加权平均值,可以接收一个轴参数
标准差: np.std() 方差: np.var()
排序、条件筛选函数
‘quicksort’ 快速排序 ‘mergesort’ 归并排序 ‘heapsort’ 堆排序
np.sort(array, axis, kind='quicksort', order) 默认是快读排序 np.argsort() 函数返回的是数组值从小到大的索引值
np.argmax()与np.argmin() 分别沿给定轴返回最大和最小元素的索引
np.nonzero()函数返回输入数组中非零元素的索引
np.where() 返回输入数组中满足给定条件的元素的索引
12 numpy副本和视图
副本是一个数据的完整的拷贝,如果我们对副本进行修改,它不会影响到原始数据,物理内存不在同一位置
视图是数据的一个别称或引用,通过该别称或引用以便访问、操作原有数据,但原有数据不会产生拷贝。如果我们对视图进行修改,它会影响到原始数据,物理内存在同一位置。
视图
1 numpy的切片操作返回原数据的视图
2 调用ndarray的view()函数产生一个视图
副本
1 python序列的切片操作,调用deepCopy()函数
2 调用ndarray的copy()函数产生一个副本
视图或浅拷贝
ndarray.view() 方法会创建一个新的数组对象,该方法创建的新数组的维数更改不会更改原始数据的维数
副本或深拷贝
ndarray.copy()函数创建一个副本。对副本数据修改不影响原始数据
13 numpy矩阵库(matrix)
numpy包含了一个矩阵库numpy.matlib,该模块中的函数返回的是一个矩阵,而不是ndarray对象
14 numpy线性代数
np.dot np.matmul 对向量来说是内积,对矩阵来说是矩阵的乘法,但是禁止矩阵和标量的乘法
np.determinant 数组的行列式
np.inv 计算矩阵的乘法逆矩阵
15 numpy IO
numpy为ndarray对象引入了一个简答的文件格式:npy
npy文件用于存储重建ndarray所需的数据、图形、dtype和其他信息
常用的IO函数:
load()和save()函数是读写文件数组数据的两个主要函数,默认数组是以未压缩的原始二进制格式保存在扩展名为.npy的文件中
numpy.save(file, array, allow_pickle=True, fix_imports=True)
file: 要保存的文件,扩展名为.npy,如果文件路径末尾没有扩展名.npy,则会自动被加上
array: 要保存的数组
allow_pickle: 可选,布尔值,陨石使用pickles保存对象数组,fix_imports: 可选,方便python2读取python3中保存的数据
numpy.savez()函数将多个数组保存到以npz为扩展名的文件中
16 numpy matplotlib
matplotlib是python的绘图库,它可与numpy一起使用,提供了一种有效的matlab开源替代方案。
17 numpy random模块
简单的随机数据
np.random.rand(d0, d1, ..., dn) #返回一个或一组服从0-1均匀分布的随机样本值。取值范围是[0, 1),不包括1
np.random.randn(d0, d1, ..., dn) # 返回一个样本,具有标准正太分布
np.random.randint(low, high=None, size=None, dtype='l') # 返回随机整数,范围为区间[low, high) ,high没有填写时,随机数范围为[0, low)
np.random.random(size=None) # 随机生成[0, 1)之间的浮点数
np.random.choice(a, size=None, replace=True, p=None) # replace=False时,生成的随机数不能有重复的数值
从给定的一维数组中生成随机数
参数a是一维数组;size为数组维度;p为数组中的数据出现的概率
a为整数时,对应的一维数组为np.arange(a)
排列
arr = np.arange(10)
np.random.shuffle(arr) # 现场修改序列,改变自身内容
np.random.permutation(10) # 返回一个随机序列,但是不改变自身内容
np.random.permutation(arr)
np.random.permutation([1, 4, 9, 12, 15])
分布
np.random.uniform(low, high, size)
随机数生成器
np.random.seed() # 使得随机数据可预测
当我们设置相同的seed,每次生成的随机数相同。如果不设置seed,则每次都会生成不同的随机数