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]]

numpy中的坑

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)

4、多使用reshape方法,不要害怕麻烦