numpy对数组的运算还是很强大的,来看看有哪些把。
首先是加减法
T = np.random.randint(1,5,20) # 1到5 里20 个随机数
T
array([4, 1, 1, 4, 4, 2, 3, 2, 1, 1, 1, 3, 1, 3, 3, 4, 4, 1, 3, 1])
T + 5
array([9, 6, 6, 9, 9, 7, 8, 7, 6, 6, 6, 8, 6, 8, 8, 9, 9, 6, 8, 6])
T * 10 / 2
array([20., 5., 5., 20., 20., 10., 15., 10., 5., 5., 5., 15., 5.,
15., 15., 20., 20., 5., 15., 5.])
数组之间的乘除
R = np.random.randint(5,12,20)
R
array([ 9, 5, 10, 11, 8, 5, 9, 11, 9, 8, 9, 9, 9, 7, 8, 9, 7,
8, 7, 5])
T * R # 数组在运算之后 不会保存当前的值,意思是 下一次继续运算,会以初始值运算
array([36, 5, 10, 44, 32, 10, 27, 22, 9, 8, 9, 27, 9, 21, 24, 36, 28,
8, 21, 5])
如果是不同位数的数组呢?比如同是一维数组,一个有4个元素,另一个有6个元素,他们相乘会发生什么事呢?
N = np.arange(1,15,3)
2
3
N
4
Out[31]:
array([ 1, 4, 7, 10, 13])
In [32]:
M
1
M = np.arange(1,5,2)
2
M
Out[32]:
array([1, 3])
In [33]:
M
1
N * M
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-33-f56553ba0024> in <module>
----> 1 N * M
ValueError: operands could not be broadcast together with shapes (5,) (2,)
只要数组类型不对,都不能进行运算。
接下来是多维数组的运算
G = np.random.randint(1,5,(5,4)) # 生成5行 4列 1到5 的随机素组
G
1
G = np.random.randint(1,5,(5,4)) # 生成5行 4列 1到5 的随机素组
2
G
Out[22]:
array([[1, 1, 1, 2],
[2, 4, 4, 3],
[1, 4, 1, 4],
[1, 2, 2, 1],
[4, 1, 2, 3]])
In [36]:
1
T = np.random.randint(1,8,(5,4))
2
T
Out[36]:
array([[7, 7, 5, 7],
[4, 4, 7, 2],
[1, 6, 5, 4],
[4, 6, 2, 7],
[2, 6, 6, 1]])
In [37]:
T * G
1
T * G
Out[37]:
array([[ 7, 7, 5, 14],
[ 8, 16, 28, 6],
[ 1, 24, 5, 16],
[ 4, 12, 4, 7],
[ 8, 6, 12, 3]])
需要注意的是 数组的乘法是两个相同的行列的数组每个对应的元素相乘,不是矩阵内积,矩阵内积可以是不同的行列数
如下:
A1 = ([[3,1],
[2,3],
[5,1]
])
B1 = ([[5,1,2],
[3,1,4]])
np.dot(A1,B1)
1
A1 = ([[3,1],
2
[2,3],
3
[5,1]
4
])
5
B1 = ([[5,1,2],
6
[3,1,4]])
7
np.dot(A1,B1)
Out[23]:
array([[18, 4, 10],
[19, 5, 16],
[28, 6, 14]])
怎么运算?复习一下 :
A = {
3,1
2,3
5,1
}
B = {
5,1,2
3,1,4
}
A和B的矩阵内积 = {
3x5+3x1 , 3x1+1x1, 3x2+1x4
2x5+3x3, 2x1+3x1, 2x2+3x4
5x5+3x1, 5x1+1x1, 2x5+1x4
}
对于不同的维度的数组,进行运算的时候,Numpy 会尝试使用广播机制来匹配,如果能匹配,就能进行运算。
进行匹配的要求是,必须有一个维度相同,看例子
G = np.random.randint(1,5,(5,4)) # 生成5行 4列 1到5 的随机素组
G
1
G = np.random.randint(1,5,(5,4)) # 生成5行 4列 1到5 的随机素组
2
G
Out[22]:
array([[1, 1, 1, 2],
[2, 4, 4, 3],
[1, 4, 1, 4],
[1, 2, 2, 1],
[4, 1, 2, 3]])
T = np.random.randint(1,8,(5,1))
T
1
T = np.random.randint(1,8,(5,1))
2
T
Out[38]:
array([[3],
[5],
[1],
[1],
[6]])
T + G
1
T + G
Out[41]:
array([[ 4, 4, 4, 5],
[ 7, 9, 9, 8],
[ 2, 5, 2, 5],
[ 2, 3, 3, 2],
[10, 7, 8, 9]])
再看看 同列的
G = np.random.randint(1,5,(5,4)) # 生成5行 4列 1到5 的随机素组
G
1
G = np.random.randint(1,5,(5,4)) # 生成5行 4列 1到5 的随机素组
2
G
Out[22]:
array([[1, 1, 1, 2],
[2, 4, 4, 3],
[1, 4, 1, 4],
[1, 2, 2, 1],
[4, 1, 2, 3]])
In [42]:
1
T = np.random.randint(1,8,(1,4))
2
T
Out[42]:
array([[6, 3, 5, 7]])
In [43]:
1
T + G
Out[43]:
array([[ 7, 4, 6, 9],
[ 8, 7, 9, 10],
[ 7, 7, 6, 11],
[ 7, 5, 7, 8],
[10, 4, 7, 10]])
总结 广播机制要求两个数组必须有一个维度相同,比如 A=(5,4),B=(5,1) 这两者行数相同 进行广播的时候,列数少的先复制本数组的内容使其变成和A数组相同的行列数;再进行运算,列数相同行数不同的也是一样的意思。