我尝试将2个矩阵x,y乘以形状(41)和(41,6) 因为它应该将单个矩阵广播到多维中的每个箭头
我想这样做:
x*y
但我收到此错误
ValueError: operands could not be broadcast together with shapes (41,6) (41,)
我有什么想念的吗?
答案 0 :(得分:2)
广播涉及两个步骤
为所有数组提供相同数量的维度
展开1
尺寸以匹配其他数组
使用您的输入
(41,6) (41,)
一个是2d,另一个是1d;广播可以将1d更改为(1, 41)
,但不会自动向另一个方向展开(41,1)
。
(41,6) (1,41)
(41,41)或(6,41)都不匹配。
因此,您需要将y
更改为(41,1)
或将x
更改为(6,41)
x.T*y
x*y[:,None]
当然,我假设您需要逐个元素乘法,而不是np.dot
矩阵乘积。
答案 1 :(得分:1)
不完全确定,你想要实现的目标。也许您可以举例说明您的输入和预期输出。一种可能性是:
import numpy as np
x = np.array([[1, 2], [1, 2], [1, 2]])
y = np.array([1, 2, 3])
res = x * np.transpose(np.array([y,]*2))
这会将x的每一列乘以y,因此上面示例的结果为:
array([[1, 2],
[2, 4],
[3, 6]])
答案 2 :(得分:1)
你可以尝试一下,它会起作用!
(1)
答案 3 :(得分:0)
取决于您的期望。一个简单的解决方案是:
y*x
那应该给你一个维度矩阵(1,6)。
答案 4 :(得分:0)
如果您希望将维度(n)的X乘以维度(n,m)的Y,则可以考虑此post的答案
提示也可以在Wikipedia中找到:
在Python中使用numpy数值库或者sympy符号库,将数组对象乘以a1 * a2会产生Hadamard乘积,但除了矩阵对象之外,m1 * m2将产生矩阵乘积。
简单来说,将其切片到数组并执行x * y,或使用其他路径来满足要求。
答案 5 :(得分:0)
默认情况下,ND数组(例如A)与一维1(B)的乘法是在最后一个轴上执行的,这意味着乘法A * B仅在
下有效 A.shape[-1] == len(B)
要在另一个轴上将A与B相乘而不是-1,一种解决方法是在相乘前后交换A的轴:
要在轴“ axis”上乘以A和B,请使用
C = (A.swapaxes(axis, -1) * B).swapaxes(axis, -1)
示例
A = np.arange(2 * 3 * 4).reshape((2, 3, 4))
B = np.array([0., 1., 2.])
print(A, B)
array([[[ 0., 0., 0., 0.],
[ 4., 5., 6., 7.],
[16., 18., 20., 22.]],
[[ 0., 0., 0., 0.],
[16., 17., 18., 19.],
[40., 42., 44., 46.]]])
C = A * B
ValueError: operands could not be broadcast together with shapes (2,3,4) (3,)
C = (A.swapaxes(1, -1) * B).swapaxes(1, -1)
array([[[ 0., 0., 0., 0.],
[ 4., 5., 6., 7.],
[16., 18., 20., 22.]],
[[ 0., 0., 0., 0.],
[16., 17., 18., 19.],
[40., 42., 44., 46.]]])
请注意,A的第一个原始数已乘以0 最后的原始数乘以2