numpy笔记


具体可参考.ipynb文件

创建np数组

import numpy as np
m = np.array([np.arange(2), np.arange(2)])
m

[[0, 1],
[0, 1]]

np.zeros((2,2)) # 创建一个值均为0的2*2矩阵

[[0., 0.],
[0., 0.]]

np.ones((1,2)) # 创建一个值均为1的1*2矩阵

[[1., 1.]]

np.full((2,2), 7) # 创建一个值均为7的2*2矩阵

([[7, 7],
[7, 7]]

np.eye(2) # 创建一个2*2单位矩阵

[[1., 0.],
[0., 1.]]

np.eye(3,k=1) # 第一个参数是矩阵的行/列数
# 第二个参数默认为0
# 若k>0,则从中心对角线起右上角第k条对角线全为1
# 若k<0,则从中心对角线起左下角第k条对角线全为1

[[0., 1., 0.],
[0., 0., 1.],
[0., 0., 0.]]

np.eye(4,k=2)

[[0., 0., 1., 0.],
[0., 0., 0., 1.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]]

np.random.random((2,2))

[[0.04065736, 0.35996263],
[0.40312977, 0.84368045]]

改变数组维度

a = np.arange(8)
a.resize(2,4)
a

[[0 1 2 3],
[4 5 6 7]]

a = np.arange(8).reshape(2,4)
b = a.ravel() # 展平数组
b[0] = -1 # ravel共享内存
a

[[-1, 1, 2, 3],
[ 4, 5, 6, 7]]

a = np.arange(8).reshape(2,4)
b = a.flatten() # 展平数组
b[0] = -1 # flatten重新创建内存
a

[[0, 1, 2, 3],
[4, 5, 6, 7]]

a.T # 转置,等同于a.transpose()

[[0, 4],
[1, 5],
[2, 6],
[3, 7]]

数组的组合

a = np.arange(6).reshape(2,3)
b = a * 2
# 左右拼接
print(np.hstack((a,b)))
print(np.concatenate((a,b),axis=1))

[[ 0 1 2 0 2 4]
[ 3 4 5 6 8 10]]
[[ 0 1 2 0 2 4]
[ 3 4 5 6 8 10]]

# 上下拼接
print(np.vstack((a,b)))
print(np.concatenate((a,b),axis=0))

[[ 0 1 2]
[ 3 4 5]
[ 0 2 4]
[ 6 8 10]]
[[ 0 1 2]
[ 3 4 5]
[ 0 2 4]
[ 6 8 10]]

print(np.dstack((a,b))) # 深度组合,将一系列数组沿着纵轴方向进行层叠组合

[[[ 0 0]
[ 1 2]
[ 2 4]]
[[ 3 6]
[ 4 8]
[ 5 10]]]

数组的分割

a = np.arange(6).reshape(2,3)
np.split(a,3,axis=1) # 水平分成3个,等同于np.hsplit(a,3)

[[[0],
[3]],
[[1],
[4]],
[[2],
[5]]]

a = np.arange(6).reshape(2,3)
np.split(a,2,axis=0) # 垂直分成2个,等同于np.vsplit(a,2)

[([[0, 1, 2]]), [[3, 4, 5]])]

a = np.arange(6).reshape(1,2,3)
np.dsplit(a,3) # 深度方向分成3个,必须是三维数组及以上

[[[[0],
[3]]],
[[[1],
[4]]],
([[[2],
[5]]]]

常用函数

a = np.array([[3,1,2],[0,5,4]])
np.sort(a,axis=1) # 按行升序

[[1, 2, 3],
[0, 4, 5]]

np.sort(a,axis=0) # 按列升序

[[0, 1, 2],
[3, 5, 4]]

-np.sort(-a,axis=1) # 按列降序

[[3, 2, 1],
[5, 4, 0]]

a = np.array([[3,1,2],[0,5,4]])
np.argmax(a) # 返回最大值的下标,可以理解为先展平成1维数组,再寻找下标
b = np.array([np.nan, 2, 4])
print(np.argmax(b))
print(np.nanargmax(b)) # 忽略nan

0
2

a = np.array([[3,1,2],[0,5,4]])
np.argwhere(a <= 4) # 返回小于4的元素位置

[[0, 0],
[0, 1],
[0, 2],
[1, 0],
[1, 2]], dtype=int64)

a = np.arange(5)
indices = np.searchsorted(a, [-2,7]) # np.searchsorted(a,b) 返回将b插入a
#searchsorted函数:为指定的插入值寻找维持数组排序的索引位置。该函数使用二分搜索算法。
#在不打乱a数组排序结果基础上插入b数组,返回b数组每个元素如果插入的话对应的位置。
print(indices)
print(np.insert(a, indices, [-2,7]))

[0 5]
[-2 0 1 2 3 4 7]

a = np.array([2,6,1,3])
print(np.median(a)) # 求中位数
print(np.mean(a))   # 求均值
print(np.var(a))    # 求方差
print(np.std(a))    # 求标准差

2.5
3.0
3.5
1.8708286933869707

np.diff(a) # 后一项减前一项

[ 4, -5, 2]

运算

a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
print("a.dot(b):\n", a.dot(b)) # 数乘
print("a @ b:\n", a @ b)       # 数乘
print("a * b:\n", a * b)       # 哈达玛乘积 对应元素相乘
aMat = np.mat(a)
bMat = np.mat(b)
print("aMat * bMat:\n", aMat * bMat)

a.dot(b):
[[19 22]
[43 50]]
a @ b:
[[19 22]
[43 50]]
a * b:
[[ 5 12]
[21 32]]
aMat * bMat:
[[19 22]
[43 50]]

数组排序

x = np.array([3,6,4,3])
y = np.array([7,3,3,6])
np.lexsort((y,x)) # 优先级排序:先按照x排序,再按照y排序

[3, 0, 2, 1]

删除

x = np.array([3,6,4,3])
np.delete(x,2) # 删除x中下标为2的元素

[3, 6, 3]