Numpy常用函数与知识点总结
Numpy数组初始化
import numpy as np # 引入库
array = np.array([[1,2,3],[2,3,4]], dtype=np.int64) # 初始化矩阵
np.empty((2,3)) # 初始化为接近于0的2*3矩阵
np.arange(12) # 初始化0-11的矩阵
np.arrange(12).reshape((3,4)) # 初始化后调整shape为3*4
np.linspace(1,10,16).reshape((3,4)) # 初始化1-10范围内16个等距点
np.random.random((2,3)) # 初始化随机的2*3矩阵
Numpy数组性质
函数 | 说明 | 输出 |
array1.dot(array2) | 矩阵点乘 | |
array1*array2 | 矩阵叉乘 | |
array*n | 矩阵乘常数 | 常数与矩阵每个元素相乘 |
array.T | 矩阵转置 | |
array.ndim | 维度 | 2 |
array.shape | 形状 | (2, 3) |
array.size | 元素数量 | 6 |
array.dtype | 元素的类型 | int64 |
Numpy数组运算
函数 | 说明 |
np.sum(array, axis=1) | 0:按列跨行; 1:按行跨列 |
np.min(array) | 最小值 |
np.max(array) | 最大值 |
np.argmin(array) | 最小值索引 |
np.argmax(array) | 最大值索引 |
np.mean(array) | 平均值 |
np.average(array) | 平均值 |
np.median(array) | 中位数 |
np.cumsum(array) | 累加 |
np.diff(array) | 相邻两数相减 |
np.nonzero(array) | 非零值的行数和列数 |
np.sort(array) | 每行单独排序 |
np.transpose(array) | 对称矩阵,等价于array.T |
np.clip(array, m ,n) | 所有小于n的数修改为n,所有大于m的数修改为m;可用来修正sigmoid函数输出,防止过拟合 |
Numpy数组合并分割与复制
np.vstack(array1, array2) # vertical stack垂直合并
np.hstack(array1, array2) # horizontal stack横向合并 # 注意一个一维矩阵,不能通过转置将横向数列转变为纵向数列
array[np.newaxis,:] # 在行上加一个维度 array[:,np.newaxis] # 在列上加一个维度,可实现横向变纵向
np.concatenate((array1, array2, array3, array4), axis=1) # 多个数组合并; 0:跨行合并; 1:跨列合并
np.split(array, 2, axis=0) # 平均分割; axis=0:跨行分割; axis=1:跨列分割
np.array_split(array, 3, axis=0) # 不均等分割
np.vsplit(array, 3) # 纵向分割, 跨行分割, axis=0
np.hsplit(array, 2) # 横向分割, 跨列分割, axis=1
array1 = array # id相同
array2 = array.copy() # 深层复制, id不同
代码技巧
array[array==5]=0 # array中所有值等于5的元素修改为0
for row in array:
print(row) # 输出行
for column in array.T:
print(column) # 输出列,通过转置
for item in array.flat:
print(item) # 输出每个元素,通过压缩为一维矩阵
array1 = np.zeros((200, 200), order='C') #C-type
array2 = np.zeros((200, 200), order='F') #Fortran
np.concatenate((a, b), axis=0) #axis=0合并,跨行合并,C更快
np.concatenate((a, b), axis=0) #axis=1合并,跨列合并,F更快
array.flatten() # 压缩为一维矩阵
array.ravel() # 压缩为一维矩阵,速度比flatten快,ravel()是view而非flatten的copy
# ---------view--------
a_view1 = a[1:2, 3:6] # 切片 slice
a_view2 = a[:100] # 同上
a_view3 = a[::2] # 跳步
a_view4 = a.ravel() # 上面提到了
# ---------copy--------
a_copy1 = a[[1,4,6], [2,4,6]] # 用 index 选
a_copy2 = a[[True, True], [False, True]] # 用 mask
a_copy3 = a[[1,2], :] # 虽然 1,2 的确连在一起了, 但是他们确实是 copy
a_copy4 = a[a[1,:] != 0, :] # fancy indexing
a_copy5 = a[np.isnan(a), :] # fancy indexing
# ---------建议--------#
1.使用 np.take() , 替代用 index 选数据的方法.
np.take(array_all, array_indices, axis=0)
# 从array_all中取出array_indices指向的数据
# 2.使用 np.compress(), 替代用 mask 选数据的方法.
np.compress(mask, a, axis=0) # 用True和False取出数据
a = a + 1 # 0.035230
a = np.add(a, 1) # 0.032738
# 上面两个功能相同, 是copy格式, 但存在时间差
a += 1 # 0.011219
np.add(a, 1, out=a) # 0.008843
# 上面两个功能相同, 是view格式, 但存在时间差