第八天,数组的一些运算

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数组相同的行列数;再进行运算,列数相同行数不同的也是一样的意思。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值