目录
3.数学运算
4.broadcasting
3.数学运算
3.1逐个元素的运算:
可以进行基本的加减乘除,这里只列举两种
3.1.1逐个元素求和
x = np.array([[1,2],[3,4]], dtype=np.float64)
y = np.array([[5,6],[7,8]], dtype=np.float64)
print(x)
print(y)
#out<<
[[1. 2.]
[3. 4.]]
[[5. 6.]
[7. 8.]]
#直接对应相加
x + y
#out<<
array([[ 6., 8.],
[10., 12.]])
#直接调用函数相加
np.add(x,y)
#out<<
array([[ 6., 8.],
[10., 12.]])
3.1.2逐元素作差
#x - y
#np.substract(x,y)
3.2矩阵的乘法运算
3.2.1 求向量內积
v = np.array([9,10])
w = np.array([10,11])
#方法1
v.dot(w)
#out<<
200
#对应元素相乘后相加 9*10 +10*11 = 200
#方法2
np.dot(x,w)
#out<<
200
3.2.2 求矩阵乘法
x = np.array([[1,2], [3,4]])
y = np.array([[5,6], [7,8]])
#x.dot(y)
np.dot(x,y)
#out<<
array([[19, 22],
[43, 50]])
np.dot(y,x)
#out<<
array([[23, 34],
[31, 46]])
#注意顺序不同,结果不同
3.2.3 求矩阵转置
x = np.array([[1,2], [3,4]])
x.T
array([[1, 3],
[2, 4]])
#高维的tensor也可以做转置
#难点
arr = np.arange(16).reshape(2,2,4)#生成2个2行4列的矩阵
print(arr, arr.shape)
#out<<
[[[ 0 1 2 3]
[ 4 5 6 7]]
[[ 8 9 10 11]
[12 13 14 15]]] (2, 2, 4)
print(arr.transpose((1,0,2)))#注意默认为0,1,2,即为x,y,z轴
[[[ 0 1 2 3]
[ 8 9 10 11]]
[[ 4 5 6 7]
[12 13 14 15]]]
以4为例,4原来坐标为(0,1,0),经过变换之后,x轴与y轴交换,即4的坐标变换为(1,0,0)
#便是现在的位置
a = np.arange(8).reshape(2,2,2)
np.swapaxes(a,2,0)#等价于np.transpose(a,(2,1,0))
#out<<
array([[[0, 4],
[2, 6]],
[[1, 5],
[3, 7]]])
#np.matmul()
a = np.arange(2*2*4).reshape((2,2,4))
b = np.arange(2*2*4).reshape((2,4,2))
c = np.arange(1*2*4).reshape((1,4,2))
np.matmul(a,b)
np.matmul(a,c)
#out<<
[[[ 28 34]
[ 76 98]]
[[428 466]
[604 658]]]
[[[ 28 34]
[ 76 98]]
[[124 162]
[172 226]]]
np.matmul(a,b)则会将a的第一个矩阵和bb的第一个矩阵相乘,将a的第二个矩阵b的第二个矩阵相乘,最终得到一个2×2×2的结果
同理,同样对于c,它会被理解成一个4×2的矩阵的stack,对于np.matmul(a,c),则会广播c的一个矩阵,将a的第一个矩阵和第二个矩阵分别与c的一个矩阵相乘最终得到一个2×2×2的结果
#矩阵内元素求和 np.sum()函数
x= np.array([[1,2], [3,4]])
#print(np.sum(x))
print(x.sum())
#out<<
10
#对每一列求和
print(np.sum(x,axis = 0))
#out<<
[4 6]
#对每一行求和
print(np.sum(x,axis = 1))
#out<<
[3 7]
#np.mean()#求平均值
print(np.mean(x))
print(np.mean(x, axis=0))
print(np.mean(x, axis=1))
#out<<
2.5
[2. 3.]
[1.5 3.5]
#cumsum()
print(x.cumsum(axis=0))#每一列往下加
print(x.cumsum(axis=1))#每一行往右加
#out<<
[[1 2]
[4 6]]
[[1 3]
[3 7]]
#cumprod()
print(x.cumprod(axis=0))#每一列往下乘
print(x.cumprod(axis=1))#每一行往右乘
#out<<
[[1 2]
[3 8]]
[[ 1 2]
[ 3 12]]
#数组排序sort()
arr = np.random.randn(8) * 10
print(arr)
#out<<
[ -6.24660201 -15.58258586 1.15676204 11.54353536 13.8556186
-6.89290567 -12.91138002 12.821078 ]
arr.sort()
print(arr)
#out<<
[-15.58258586 -12.91138002 -6.89290567 -6.24660201 1.15676204
11.54353536 12.821078 13.8556186 ]
#二维数组也可以在某些维度上排序
arr = np.random.randn(5,3) * 10
print(arr)
#out<<
[[ -0.02512307 17.20191497 0.74223841]
[-17.27291867 -13.00197112 -5.92251587]
[ -5.59044821 -8.86042079 -3.41354389]
[ 19.03995704 -5.91193954 -1.3943038 ]
[ -3.69189399 11.19939905 -13.96774803]]
#按照行排序
arr.sort(1)
#arr.sort(0)按照列排序
print(arr)
#out<<
[[ -0.02512307 0.74223841 17.20191497]
[-17.27291867 -13.00197112 -5.92251587]
[ -8.86042079 -5.59044821 -3.41354389]
[ -5.91193954 -1.3943038 19.03995704]
[-13.96774803 -3.69189399 11.19939905]]
#找出排序后位置在5%的数字
large_arr = np.random.randn(1000)
large_arr.sort()
print(large_arr[int(0.05*len(large_arr))])
#out<<
-1.811993526121341
4.Broadcasting
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
v = np.array([1,0,1])
print(x)
print()
print(v)
#out<<
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
[1 0 1]
#赋值x格式给y
y = np.empty_like(x)
print(y)
#out<<
[[0 0 0]
[0 0 0]
[0 0 0]
[0 0 0]]
a = np.arange(3)
print(a)
#out<<
[0 1 2]
a + 5#broadcasting每一个元素都要加
#out<<
array([5, 6, 7])
b = np.ones((3,3)
print(b)
#out<<
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
c =np.arange(3)
print(c)
#out<<
[0 1 2]
print(b + c)
[[1. 2. 3.]
[1. 2. 3.]
[1. 2. 3.]]