numpy:行数乘以数组

时间:2014-04-08 10:25:06

标签: python numpy

我有那些数组:

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

b = np.array([1,2,3,4])

我想让它们像这样繁殖:

[[1*1, 2*1],
[3*2, 4*2],
[5*3, 6*3],
[7*4, 8*4]]

...基本上out[i] = a[i] * b[i],其中a[i].shape(2,)b[i]则为标量。

诀窍是什么? np.multiply似乎不起作用:

>>> np.multiply(a, b)
ValueError: operands could not be broadcast together with shapes (4,2) (4)

5 个答案:

答案 0 :(得分:27)

将轴添加到b:

>>> np.multiply(a, b[:, np.newaxis])
array([[ 1,  2],
       [ 6,  8],
       [15, 18],
       [28, 32]])

答案 1 :(得分:7)

>>> a * b.reshape(-1, 1)
array([[ 1,  2],
       [ 6,  8],
       [15, 18],
       [28, 32]])

答案 2 :(得分:3)

对于那些不想使用np.newaxisreshape的人,这很简单:

a * b[:, None]

这是因为np.newaxis实际上是None的别名。

了解更多here

答案 3 :(得分:1)

这里缺少的是einsumdoc)变体:

np.einsum("ij,i->ij", a, b)

这使您可以完全控制索引,并且ab被传递为空白。

答案 4 :(得分:0)

我认为它看起来不错,但很幼稚,因为如果更改a或b的尺寸,则解决方案

np.mulitply(a, b[:, None])

不再工作。

我一直对将任意大小的行上升(甚至更一般地说是第n维)相乘的数组存有相同的疑问。

我曾经做过类似的事情

 z = np.array([np.multiply(a, b) for a, b in zip(x,y)])

,适用于尺寸为1或2的x或y。

与其他numpy方法一样,它是否具有带有“ axis”参数的方法?像

 z = np.mulitply(x, y, axis=0)