【发布时间】:2017-12-26 06:54:50
【问题描述】:
所有,我有一个应用程序需要在将两个矩阵相乘时返回一个 numpy ndarray,而不是一个简单的总和;例如:
import numpy as np
x = np.array([[1, 1, 0], [0, 1, 1]])
y = np.array([[1, 0, 0, 1], [1, 0, 1, 0], [0, 0, 0, 0]])
w = x @ y
>>> array([[2, 0, 1, 1],
[1, 0, 1, 0]])
但是,要求是返回一个ndarray(在这种情况下..):
array([[[1,1,0], [0,0,0], [0,1,0], [1,0,0]],
[[0,1,0], [0,0,0], [0,1,0], [0,0,0]]])
注意矩阵乘法运算可能会重复;输出将用作 ndarrays 的左侧矩阵,用于下一次矩阵乘法运算,这将在第二次矩阵乘法运算等之后产生更高阶的 ndarray。
有什么方法可以做到这一点?我通过子类化 np.ndarray as discussed here 查看了重载 __add__ 和 __radd__,但大多出现维度不兼容错误。
想法?
更新:
解决@Divakar's answer 例如,对于链式操作,添加
z = np.array([[1, 1, 0], [0, 0, 0], [1, 0, 0], [0, 1, 0]])
s1 = x[...,None] * y
s2 = s1[...,None] * z
导致不希望的输出。
我怀疑问题从 s1 开始,在上述情况下返回 s1.shape = (2,3,4)。应该是(2,4,3),因为[2x3][3x4] = [2x4],但是我们这里并没有真正求和,只是返回一个长度为3的数组。
同样,s2.shape 应该是 (2,3,4,3),[顺便说一下] 它是,但输出不理想(它不是“错误”,只是不是我们想要的)。 详细地说,s1*z 应该是 [2x4][4x3] = [2x3] 矩阵。矩阵的每个元素本身就是一个 [4x3] 的 ndarray,因为我们在 z 中有 4 行来乘以 s1 中的元素,并且 s1 中的每个元素本身就是 3 个元素长(同样,我们不是在算术上添加元素,而是返回 ndarrays,扩展维度是操作的 R 矩阵中的行数。
最终,所需的输出将是:
s2 = array([[[[1, 1, 0],
[0, 0, 0],
[0, 1, 0],
[0, 0, 0]],
[[1, 1, 0],
[0, 0, 0],
[0, 0, 0],
[1, 0, 0]],
[[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]]],
[[[0, 1, 0],
[0, 0, 0],
[0, 1, 0],
[0, 0, 0]],
[[0, 1, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]],
[[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]]]])
【问题讨论】:
-
这看起来更像是一个外部产品。
标签: python numpy multidimensional-array matrix-multiplication