import numpy as np
Contents
- 初始化数组
- 数组的取值与赋值
- 数组的数值运算
- 广播机制(Broadcasting)
- 逻辑运算
- 其他高级的 ndarray 处理
- 文件的输入输出
1. 初始化数组
a = np.array([1,2,3]) # 将 list 类型数组转换为ndarray数组, 也可以通过 dtype 参数确定数组中元素的数据类型
type(a) # 查看 a 的类型,此处为 numpy.ndarray, a.dtype 返回 a 中元素的类型,有 int32, float64, int64, np.string_等
a[0] # 可以通过下标的 index 来访问 ndarray 中的元素, 如二维数组可以通过 a[i][j] 或者 a[i,j] 的形式进行访问
a.shape # 查看 a 的形状,以 tuple 的形式返回,此处返回 (3,)
a.astype(np.float64) # 复制数组并转换数据类型,将 float 转换为 int 时小数部分被舍弃,当 dtype = np.string_ 时,可以转换为相应的数值
其他内置创建数组的函数:
函数 | 说明 |
---|---|
zeros((2,3)) | 生成 2*3 的 array |
ones((1,2)) | 生成 1*2 的 array |
full((2,3), 8) | 生成 2*3 的 array, 并把元素都填充成8 |
eye(3) | 生成 3*3 的单位阵 |
random.random((2,3)) | 生成 2*3 的随机 array, 随机值在[0,1)之间 |
random.randn((2,3)) | 生成 2*3 的随机 array, 随机值符合正态分布 |
empty((2,3)) | 生成 2*3 的空 array, 其中元素是没有经过初始化的随机值 |
empty_like(a) | 生成与 a 形状相同的未经过初始化的空array |
arange(5) | 生成 array: [0,1,2,3,4] |
2.数组的取值与赋值
a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
a[0:2,2:4] # 对 a 进行切片得到的是一个 2*2 的数组
a[1,:] # 切片得到 [5,6,7,8]
a[[1], :] # 切片得到 [[5,6,7,8]]
a[[0,1,2],[0,1,0]] # 取出 a[0][0], a[1][1], a[2][0]中的元素,构成一个一维数组,结果为 [1, 6, 9]
bool_index = (a > 3) # 此时 bool_index 为与 a 形状相同的数组,a 中对应元素满足右侧条件的地方在 bool_index 中为 True, 否则为 False
a[a>2] # 将 a 中大于2的元素筛选出来组成以为数组返回。
3. 数组的数值运算
a = np.array([[1,2,3],[4,5,6]], dtype=np.float64)
b = np.array([[7,8,9],[10,11,12]], dtype=np.float64)
逐个元素做运算(elements wise)
方法 | 说明 |
---|---|
np.add(a,b) 或 a+b | a 与 b 中逐个元素做加法 |
np.subtract(a,b) 或 a-b | a 与 b 中逐个元素做减法 |
np.multiply(a,b) 或 a*b | a 与 b 中逐个元素做乘法 |
np.divide(a,b) 或 a/b | a 与 b 中逐个元素做除法 |
np.sqrt(a) | 对 a 中逐个元素求平方根 |
矩阵运算
a.dot(b) 或 np.dot(a,b) # 当 a,b 为同等长度的一维数组时,求的是 a,b 两个的向量内积, 返回一个数值; 当 a,b 为多维数组且满足矩阵乘法的要求是,求的是矩阵乘法
a.shape # 以 tuple 的形式返回 a 的形状
a.T # 对 a 矩阵进行转置,1维的数组转置还是自己
b.transpose((0,2,1)) # 加入此处 b 为3维数组,(0,2,1)表示将1,2两维进行装置
b.swapaxes(1,2) # 也能达到将 b 数组的1,2两维进行转置的效果
a.reshape(2,3,4) # 将 a 转换成 234 形状的数组,在某一维写 -1,numpy 会自动计算出正确的维度。
np.sum(a) 或 a.sum() # 求 a 中所有元素的和,返回一个数值;
若在括号里加入 axis=0或1,为0时表示对 a 中元素每一列分别求和,并放回一个长度与a的列数相等的1维数组;axis为1时表示对 a 中元素每一行分别求和,并放回一个长度与a的行数相等的1维数组np.mean(a) 或 a.mean() #求平均值,与上一条 sum() 的用法类似
np.cumsum(a) 或 a.cumsum() # 累计求和,例 a = np.array([[1,2,3],[4,5,6]]),结果为 [1,3,6,10,15,21]。当括号内有 axis 时, 为0时表示对每一个列分别累计求和, 结果为 [[1,2,3],[5,7,9]]; 为1时表示对每一行分别进行累计求和, 结果为 [[1,3,6],[4,9,15]]
np.cumprod(a) 或 a.cumprod() # 累计求积, 与上一条 cumsum() 的用法一致
a.sort() # 对 a 的最后一个维度上的数据进行排序, 在括号里加入数字 0 或 1 即可在指定的维度上进行排序
4. 广播机制(Broadcasting)
a = np.array([[1,2,3,4],[5,6,7,8]])
b = np.array([2,4,6,8])
a+b # 结果是[[3,6,9,12],[7,10,13,16]]
比如要对 a,b 进行 逐个元素的求和操作,由于 a,b 的形状不相同,所以会启动广播机制。numpy 允许我们在不需要对 b 进行多次拷贝的情况下完成计算。 31 的array与 12 的array相加,得到的是 3*2 的array。broadcasting 会逐个比较两个array的形状,如果不相等时,将维数是1的array进行拷贝拓展至shape匹配。
5. 逻辑运算
a = np.array([1,3,5,7,9])
b = np.array([2,4,6,8,10])
c = np.array([True, False, True, True, Flase])
np.where(c, a, b) # 对于c中为True的位置选择a中元素,False的位置选择b中元素。结果为 [1, 4, 5, 7, 10]
np.where(a>5, 1, -1) # 对于a中元素满足条件(大于5)的位置填1,不满足条件的填-1
6. 其他高级的 ndarray 处理
函数 | 使用示例 | 功能 |
---|---|---|
ravel() | a.ravel(), np.ravel(a) | 将多维的数组转换为一维的数组 |
concatenate() | np.concatenate([a,b], axis=0) | 把a,b连接起来,axis=0时,在行的维度上合并;axis=1时,在列的维度上合并 |
vstack() | np.vstack((a,b)) | 在垂直的方向堆叠 a,b 数组 |
hstack() | np.hstack((a,b)) | 在水平的方向堆叠 a,b 数组 |
split(ary, indices_or_section, axis=0) | np.split(a,3), np.split(a, [3,5,6,10]) | 把数组按第一维度上划分成几个部分,或按list中把第一维度上的索引进行切分 |
c_ | np.c_[a,b] | 将 a,b 按列进行堆叠 |
c_ | np.c_[1:3, -2:0] | 切片直接装换为数组,结果为 [[1,-2],[2,-1]] |
r_ | np.r_[a,b] | 将 a,b 按行进行堆叠 |
c_ | np.r_[1:3, -2:0] | 切片直接装换为数组,结果为 [1,2,-2,-1] |
repeat(a, repeats, axis=None) | np.repeat(a,3),np.repeat(a,[2,3]) | 将a中的元素(复制后的元素排列在原来元素的后面)按照axis重复若干遍,或a中对应的元素在axis维度上重复list中对应的遍数 |
tile(a, repeats) | np.tile(a,3), np.tile(a,[4,2]) | 将a最大维度上(或对应的维度上)整体元素堆叠相应的次数 |
7. 文件的输入输出
data = np.loadtxt(“file.txt”, delimiter=’,’) # 读取txt文件作为数组
np.save(“some_array”, a) # 保存文件,其中a是一个数组, 当文件名为字符串时,系统会自动附上 .npy 的文件拓展名
np.load(“some_array.npy”) # 读取文件中的数组
np.savez(“array_archive.npz”, a=array1, b=array2) #将多个数组一起压缩保存
arch = np.load(“array_archive.npz”) # 得到的 arch 是一个字典,可以通过 arch[‘a’],arch[‘b’] 访问上一条所保存的数组