当我使用numpy.multiply(a,b)
将numpy数组与形状(2, 1),(2,)
相乘时,我得到一个2乘2的矩阵。但我想要的是基于元素的乘法。
我不熟悉numpy的规则。有人能解释一下这里发生了什么吗?
发布于 2018-07-15 19:38:09
下面是与您提到的形状相同的输入数组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
发布于 2018-07-15 19:38:43
假设您有两个数组,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
,您必须指定当到达数组b
的缺失axis=1
时numpy必须执行的操作。可以通过添加None
来执行此操作
result = a*b[:,None]
其中result
为:
array([[56, 0, 21],
[10, 30, 35]])
发布于 2018-07-16 00:15:22
我刚刚用broadcasting arrays in numpy解释了广播规则
在你的情况下
(2,1) + (2,) => (2,1) + (1,2) => (2,2)
它必须向第二个参数添加一个维度,并且只能在开头添加它(以避免歧义)。
所以你想要一个(2,1)结果,你必须自己用reshape
或[:, np.newaxis]
展开第二个参数。
https://stackoverflow.com/questions/51347854
复制相似问题