用于将N个2x2阵列与2xn阵列相乘的numpy点或einsum

用于将N个2x2阵列与2xn阵列相乘的numpy点或einsum,numpy,Numpy,我想用2xN数组乘以(矩阵乘法)n2x2数组 n=np.array([1,2,3]) m=np.array([[n,0*n],[0*n,0*n+1]]).T #形状:(3,2,2) # [[[1 0] # [0 1]] # [[2 0] # [0 1]] # [[3 0] # [0 1]]] x=np.数组([[1,2,3],[4,5,6]] #形状:(2,3) # [[1 2 3] # [4 5 6]] 所以结果应该是 [[1 4 9] [4 5 6]] 这在einsu

我想用2xN数组乘以(矩阵乘法)n2x2数组

n=np.array([1,2,3])
m=np.array([[n,0*n],[0*n,0*n+1]]).T
#形状:(3,2,2)
# [[[1 0]
#   [0 1]]
#  [[2 0]
#   [0 1]]
#  [[3 0]
#   [0 1]]]
x=np.数组([[1,2,3],[4,5,6]]
#形状:(2,3)
# [[1 2 3]
#  [4 5 6]]
所以结果应该是

[[1 4 9]
 [4 5 6]]
这在einsum或dot中应该是可能的,但我在两者中都失败了。从我读到的内容来看,使用dot的解决方案可能会更快


编辑:提供更多上下文:这实际上只是2xn向量上的(2x2)矩阵乘法。但是有n个不同的矩阵:n个向量元素各一个。

您可以使用
np.einsum
如下:

import numpy as np

n = np.array([1,2,3])
m = np.array([[n,0*n],[0*n,0*n+1]]).T

x = np.array([[1,2,3],[4,5,6]])

result = np.einsum('nij, jn->in', m, x)
einsum
中,
n
是三维索引,
i
j
是2x2矩阵和二维数组之间的和的索引

结果
为:

array([[1, 4, 9],
       [4, 5, 6]])

您可以按如下方式使用
np.einsum

import numpy as np

n = np.array([1,2,3])
m = np.array([[n,0*n],[0*n,0*n+1]]).T

x = np.array([[1,2,3],[4,5,6]])

result = np.einsum('nij, jn->in', m, x)
einsum
中,
n
是三维索引,
i
j
是2x2矩阵和二维数组之间的和的索引

结果
为:

array([[1, 4, 9],
       [4, 5, 6]])

这“有点”正确。正确的结果至少就埋在这里面。但你还是需要把它弄出来。更令人担忧的是:这确实会导致更多的乘法运算。编辑:预期输出在问题中。你能写下你的预期输出吗?它直接在“所以结果应该是”下面。如果你只是想要预期输出,试试。。。einsum('ijk,…ji->ji',m,x)这是“有点”正确。正确的结果至少就埋在这里面。但你还是需要把它弄出来。更令人担忧的是:这确实会导致更多的乘法运算。编辑:预期输出在问题中。你能写下你的预期输出吗?它直接在“所以结果应该是”下面。如果你只是想要预期输出,试试。。。np.einsum('ijk,…ji->ji',m,x)