numpy中的坑
1、“*”和np.dot
a = np.random.randn(4, 3) # a.shape = (4, 3)
b = np.random.randn(3, 2) # b.shape = (3, 2)
c = a * b
请问数组“c”的维度是多少?
答:运算符 “*” 说明了按元素乘法来相乘,但是元素乘法需要两个矩阵之间的维数相同,所以这将报错,无法计算。
a = np.random.randn(4, 3) # a.shape = (4, 3)
b = np.random.randn(3, 2) # b.shape = (3, 2)
c = np.dot(a,b)
print(c.shape)
输出:(4, 2)
2、广播机制
import numpy as np
A = np.array([[56.0,0.0,4.4,68.0],
[1.2,104.0,52.0,8.0],
[1.8,135.0,99.0,0.9]])
print(A)
[[ 56. 0. 4.4 68. ]
[ 1.2 104. 52. 8. ]
[ 1.8 135. 99. 0.9]]
cal = A.sum(axis=0) # axis=0意思是沿竖直方向
print(cal)
[ 59. 239. 155.4 76.9]
# 例1
percentage = 100*A/cal.reshape(1,4) # 这种广播机制对于行向量和列向量都有用
print(percentage)
[[94.91525424 0. 2.83140283 88.42652796]
[ 2.03389831 43.51464435 33.46203346 10.40312094]
[ 3.05084746 56.48535565 63.70656371 1.17035111]]
# 例2
a = np.array([[1,2,3],
[4,5,6]])
b = np.array([100,200,300]) # python的广播机制,b会复制第一行内容,使b从(1,n)- >(m,n),然后再相加
print(a+b)
[[101 202 303]
[104 205 306]]
# 例3
c = np.array([[56.0,0.0,4.4,68.0],
[1.2,104.0,52.0,8.0],
[1.8,135.0,99.0,0.9]])
print(c+5)
[[ 61. 5. 9.4 73. ]
[ 6.2 109. 57. 13. ]
[ 6.8 140. 104. 5.9]]
3、秩为1的数组
不要使用!不要使用!不要使用! 有时会让你出现意想不到的bug。
# 关于 python _ numpy 向量的说明
import numpy as np
a = np.random.randn(5) # 创建一个5个随机高斯数
print(a.shape) # 这在 Python 中被称作秩为1的一维数组.它既不是一个行向量也不是一个列向量.
输出:
(5,)
应使用:
a = np.random.randn(1,5) #创建时使用行向量或者列向量
#或者
a = np.random.randn(5,1)