Python Row.T*矩阵的行点积

Python Row.T*矩阵的行点积,python,numpy,matrix,Python,Numpy,Matrix,我正在寻找一种更快、也许更优雅的方法来计算以下内容: 我有一个矩阵a,我想计算a的逐行点积,我想计算Ai.T*Ai,其中索引I表示矩阵a的第I行 import numpy as np A=np.arange(40).reshape(20,2) sol=[np.dot(A[ii,:].reshape(1,2).T,A[ii,:].reshape(1,2)) for ii in range(20)] 这将导致形状矩阵np。形状(sol)#=(20,2,2) 我已经看过了np.einsum,但到目前

我正在寻找一种更快、也许更优雅的方法来计算以下内容:
我有一个矩阵a,我想计算a的逐行点积,我想计算Ai.T*Ai,其中索引I表示矩阵a的第I行

import numpy as np
A=np.arange(40).reshape(20,2)
sol=[np.dot(A[ii,:].reshape(1,2).T,A[ii,:].reshape(1,2)) for ii in range(20)]
这将导致形状矩阵
np。形状(sol)#=(20,2,2)

我已经看过了
np.einsum
,但到目前为止还不能正常工作。
如果只存在一个解决方案,将所有20个2x2矩阵求和,这也没关系,因为我最终还是要求和:)


谢谢使用
np.dot
-

A.T.dot(A)
使用
np.einsum
-

np.einsum('ij,ik->jk',A,A)
样本运行-

>>> A=np.arange(40).reshape(20,2)
>>> sol=[np.dot(A[ii,:].reshape(1,2).T,A[ii,:].reshape(1,2)) for ii in range(20)]
>>> sol = np.array(sol)
>>> sol.sum(0)
array([[ 9880, 10260],
       [10260, 10660]])
>>> A.T.dot(A)
array([[ 9880, 10260],
       [10260, 10660]])
>>> np.einsum('ij,ik->jk',A,A)
array([[ 9880, 10260],
       [10260, 10660]])
如果结果必须是
20
元素数组,我认为您需要-

np.einsum('ij,ik->i',A,A)

使用
np.dot
-

A.T.dot(A)
使用
np.einsum
-

np.einsum('ij,ik->jk',A,A)
样本运行-

>>> A=np.arange(40).reshape(20,2)
>>> sol=[np.dot(A[ii,:].reshape(1,2).T,A[ii,:].reshape(1,2)) for ii in range(20)]
>>> sol = np.array(sol)
>>> sol.sum(0)
array([[ 9880, 10260],
       [10260, 10660]])
>>> A.T.dot(A)
array([[ 9880, 10260],
       [10260, 10660]])
>>> np.einsum('ij,ik->jk',A,A)
array([[ 9880, 10260],
       [10260, 10660]])
如果结果必须是
20
元素数组,我认为您需要-

np.einsum('ij,ik->i',A,A)

“所有20个2x2矩阵都求和了”“的输出形状必须是什么?很抱歉这种含糊不清。对于和,我的意思是对所有20个2x2矩阵求和,得到一个2x2矩阵
sol=[np.sum(np.dot(A[ii,:]重塑(1,2).T,A[ii,:].重塑(1,2))用于范围(20)内的ii]
请查看我文章中的编辑内容。另外,您评论中的代码:
sol=[np.sum(…
不起作用。您最好在发布之前用给定的示例验证代码。必须是-
“所有20个2x2矩阵求和”的输出形状
?很抱歉含糊不清。我的意思是对所有20个2x2矩阵求和,得到一个2x2矩阵。
sol=[np.sum(np.dot(a[ii,:].reforme(1,2).T,a[ii,:].reforme(1,2)]请查看我帖子中的编辑内容。另外,您的评论中的代码:
sol=[np.sum](…
不起作用。如果您能在发布之前用给定的示例验证代码,那就太好了。