我有一个 numpy 数组 A,其形状为 (10,)。
此时,我还有一个形状为 (10,3,5) 的 numpy 数组 B。我想在这两者之间进行乘法以获得 C,使得 C[0,:,:]=A[0]*B[0,:,:], C[1]=A[1]*B[1 ,:,:] 等
我不想用循环来解决这个问题,一个原因是事情的美学,另一个原因是这段代码需要非常通用。我希望用户能够输入几乎任何形状的任何 B,只要前导尺寸为 10。例如,我希望用户也能够输入形状为 (10,4) 的 B。
那么:我如何使用 numpy 实现这个乘法?谢谢。
附录:例如已被要求。会变小。假设 A 是 numpy 数组 [1,2,3],B 是 numpy 数组 [[1,2],[4,5],[7,8]]。我希望两者相乘得到 [[1,2],[8,10],[21,24]]。 ...
>>> a
array([1, 2, 3])
>>> b
array([[1, 2],
[4, 5],
[7, 8]])
>>> #result
>>> c
array([[ 1, 2],
[ 8, 10],
[21, 24]])
>>>
最佳答案
您可以使用None
(或np.newaxis
)来扩展A
以匹配B
:
>>> A = np.arange(10)
>>> B = np.random.random((10,3,5))
>>> C0 = np.array([A[i]*B[i,:,:] for i in range(len(A))])
>>> C1 = A[:,None,None] * B
>>> np.allclose(C0, C1)
True
但这只适用于第 2 种情况。借用@ajcr,通过足够的转置,我们可以获得适用于一般情况的隐式广播:
>>> C3 = (A * B.T).T
>>> np.allclose(C0, C3)
True
或者,您可以使用 einsum
来提供通用性。回想起来,与转置路线相比,它在这里可能有点矫枉过正,但当乘法更复杂时它很方便。
>>> C2 = np.einsum('i,i...->i...', A, B)
>>> np.allclose(C0, C2)
True
和
>>> B = np.random.random((10,4))
>>> D0 = np.array([A[i]*B[i,:] for i in range(len(A))])
>>> D2 = np.einsum('i,i...->i...', A, B)
>>> np.allclose(D0, D2)
True
关于python - numpy数组与任意维度数组的乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32189190/