>>> c= array([[[1, 2],
[3, 4]],
[[2, 1],
[4, 3]],
[[3, 2],
[1, 4]]])
>>> x
array([[0, 1, 2],
[3, 4, 5]])
返回一个矩阵,使得每列是c中每个矩阵的乘积,乘以常规矩阵乘法中x的每个相应列。我试图找出一种方法来对其进行矢量化,或者至少不使用for循环来解决它。
array([[6, 6, 16]
12, 16, 22]])
进一步扩展这个操作让我说我有一个矩阵数组,比如说
>>> c
array([[[1, 2],
[3, 4]],
[[2, 1],
[4, 3]],
[[3, 2],
[1, 4]]])
>>> x
array([[[1, 2, 3],
[1, 2, 3]],
[[1, 0, 2],
[1, 0, 2]],
[[2, 3, 1],
[0, 1, 0]]])
def fun(c,x):
for i in range(len(x)):
np.einsum('ijk,ki->ji',c,x[i])
##something
所以基本上,我想让x中的每个矩阵与所有c相乘。返回类似于c的结构而不引入for for循环
我这样做的原因是因为我遇到了解决问题的问题,试图进行矢量化
Xc(操作遵循正常矩阵列向量乘法),c为3D数组;比如上面的c--一个列向量,每个元素都是一个矩阵(在numpy中它是上面的形式)。 X是矩阵,每个元素是一维数组。 Xc的输出应该是1D数组。
答案 0 :(得分:1)
您可以使用np.einsum
-
np.einsum('ijk,ki->ji',c,x)
示例运行 -
In [155]: c
Out[155]:
array([[[1, 2],
[3, 4]],
[[2, 1],
[4, 3]],
[[3, 2],
[1, 4]]])
In [156]: x
Out[156]:
array([[0, 1, 2],
[3, 4, 5]])
In [157]: np.einsum('ijk,ki->ji',c,x)
Out[157]:
array([[ 6, 6, 16],
[12, 16, 22]])
对于x
的3D情况,只需将新维度附加到x
的字符串表示法的开头,并相应地添加到输出字符串表示法,就像这样 -
np.einsum('ijk,lki->lji',c,x)
示例运行 -
In [151]: c
Out[151]:
array([[[1, 2],
[3, 4]],
[[2, 1],
[4, 3]],
[[3, 2],
[1, 4]]])
In [152]: x
Out[152]:
array([[[1, 2, 3],
[1, 2, 3]],
[[1, 0, 2],
[1, 0, 2]],
[[2, 3, 1],
[0, 1, 0]]])
In [153]: np.einsum('ijk,lki->lji',c,x)
Out[153]:
array([[[ 3, 6, 15],
[ 7, 14, 15]],
[[ 3, 0, 10],
[ 7, 0, 10]],
[[ 2, 7, 3],
[ 6, 15, 1]]])