Ответ 1
добавьте ось в b:
>>> np.multiply(a, b[:, np.newaxis])
array([[ 1, 2],
[ 6, 8],
[15, 18],
[28, 32]])
У меня есть эти массивы:
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)
добавьте ось в b:
>>> np.multiply(a, b[:, np.newaxis])
array([[ 1, 2],
[ 6, 8],
[15, 18],
[28, 32]])
>>> a * b.reshape(-1, 1)
array([[ 1, 2],
[ 6, 8],
[15, 18],
[28, 32]])
Для тех, кто не хочет использовать np.newaxis
или reshape
, это так просто:
a * b[:, None]
Это потому, что np.newaxis
на самом деле является псевдонимом для None
.
Узнайте больше здесь.
Это выглядит красиво, но наивно, я думаю, потому что, если вы измените размеры 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)