不同形状的NumPy数组的元素乘法

时间:2018-07-15 11:18:26

标签: numpy matrix vector linear-algebra multiplication

当我使用numpy.multiply(a,b)将形状为(2, 1),(2,)的numpy数组相乘时,得到2 x 2的矩阵。但是我想要的是元素级乘法。

我对numpy的规则不熟悉。谁能解释这里发生了什么?

4 个答案:

答案 0 :(得分:1)

当在两个数组中进行维度不同的元素操作时,NumPy将执行广播。在您的情况下,Numpy将在b行中广播a

import numpy as np
a = np.array([[1],
              [2]])
b = [3, 4]
print(a * b)

礼物:

[[3 4]
 [6 8]]

为防止这种情况,您需要使ab具有相同的维数。您可以在索引中使用np.newaxisNone向数组添加维,如下所示:

print(a * b[:, np.newaxis]) 

礼物:

[[3]
 [8]]

答案 1 :(得分:1)

以下是与您提到的形状相同的输入数组ab

In [136]: a
Out[136]: 
array([[0],
       [1]])

In [137]: b
Out[137]: array([0, 1])

现在,当我们使用*numpy.multiply(a, b)进行乘法运算时,我们得到:

In [138]: a * b
Out[138]: 
array([[0, 0],
       [0, 1]])

结果是一个(2,2)数组,因为numpy使用广播。

       # b
    #a | 0     1
     ------------
     0 | 0*0   0*1
     1 | 1*0   1*1

答案 2 :(得分:0)

假设您有两个数组,分别为ab,分别为(2,3)(2,)

a = np.random.randint(10, size=(2,3))
b = np.random.randint(10, size=(2,))

例如,两个数组包含:

a = np.array([[8, 0, 3],
              [2, 6, 7]])
b = np.array([7, 5])

现在要处理元素a*b中的product元素,您必须指定到达数组axis=1缺席的b时numpy要做的事情。您可以通过添加None

result = a*b[:,None]

result为:

array([[56,  0, 21],
       [10, 30, 35]])

答案 3 :(得分:0)

我刚刚在broadcasting arrays in numpy

中解释了广播规则

以您的情况

(2,1) + (2,) => (2,1) + (1,2) => (2,2)

它必须在第二个参数中添加一个维度,并且只能在开头添加它(以避免歧义)。

因此,要获得(2,1)结果,您必须自己用reshape[:, np.newaxis]扩展第二个参数。