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)

Ответ 1

добавьте ось в b:

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

Ответ 2

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

Ответ 3

Для тех, кто не хочет использовать np.newaxis или reshape, это так просто:

a * b[:, None]

Это потому, что np.newaxis на самом деле является псевдонимом для None.

Узнайте больше здесь.

Ответ 4

Это выглядит красиво, но наивно, я думаю, потому что, если вы измените размеры a или b, решение

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

больше не работает

У меня всегда было одно и то же сомнение по поводу умножения массивов с ростом строки произвольного размера или даже, вообще говоря, по n-му измерению.

Я делал что-то вроде

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

и это работает для х или у, которые имеют размерность 1 или 2.

Существует ли он с методом с аргументом "ось", как в других методах numpy? Такие как

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