当我使用numpy.multiply(a,b)
将形状为(2, 1),(2,)
的numpy数组相乘时,得到2 x 2的矩阵。但是我想要的是元素级乘法。
我对numpy的规则不熟悉。谁能解释这里发生了什么?
答案 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]]
为防止这种情况,您需要使a
和b
具有相同的维数。您可以在索引中使用np.newaxis
或None
向数组添加维,如下所示:
print(a * b[:, np.newaxis])
礼物:
[[3]
[8]]
答案 1 :(得分:1)
以下是与您提到的形状相同的输入数组a
和b
:
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)
假设您有两个数组,分别为a
和b
,分别为(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]
扩展第二个参数。