Python 以列表作为值的矩阵运算

Python 以列表作为值的矩阵运算,python,pandas,numpy,Python,Pandas,Numpy,我有九个列表(精确地说是数据帧的列),我想对这些列的所有行进行矩阵运算。例如,我需要执行以下操作: O(G)=跟踪(G*转置(G))+跟踪(G*G),其中G是由列的每行定义的3x3矩阵。例如,对于两行: a,b,c,d,e,f,g,h,i 1,2,3,4,5,6,7,8,9 5,6,9,8,7,4,5,2,3 这两个矩阵应为: G1=[1,2,3;4,5,6;7,8,9]>执行O(G1)=546 G2=[5,6,9;8,7,4;5,2,3]>执行O(G2)=594 然后,将它们放入一个新列:

我有九个列表(精确地说是数据帧的列),我想对这些列的所有行进行矩阵运算。例如,我需要执行以下操作:

O(G)=跟踪(G*转置(G))+跟踪(G*G)
,其中G是由列的每行定义的3x3矩阵。例如,对于两行:

a,b,c,d,e,f,g,h,i
1,2,3,4,5,6,7,8,9
5,6,9,8,7,4,5,2,3
这两个矩阵应为:

G1=[1,2,3;4,5,6;7,8,9]>执行O(G1)=546

G2=[5,6,9;8,7,4;5,2,3]>执行O(G2)=594

然后,将它们放入一个新列:

a,b,c,d,e,f,g,h,i,O
1,2,3,4,5,6,7,8,9,546
5,6,9,8,7,4,5,2,3,594
我怎样才能继续呢?我认为numpy不允许创建列表为值的矩阵…

使用numpy
restrape()
flatten()

我们可以一排一排地做

l=[]
for x  in df.index:

     n=df.loc[x].values.reshape(3,3) 
     l.append(np.trace(n.dot(n))+np.trace(n.dot(n.T)))

l
[546, 594]
df['new']=l
您可以在df中的数据上使用两个

G = df.to_numpy().reshape(-1,3,3)
array([[[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]],

       [[5, 6, 9],
        [8, 7, 4],
        [5, 2, 3]]], dtype=int64)

df['0'] = np.einsum('ijk,ikj->i', G, G) + np.einsum('ijk,ijk->i', G, G)
   a  b  c  d  e  f  g  h  i    0
0  1  2  3  4  5  6  7  8  9  546
1  5  6  9  8  7  4  5  2  3  594

是的,这正是我要找的。虽然如果有很多行,计算起来会有点慢。顺便说一句,谢谢!这是否与OP的预期输出相同?关于矩阵部分,是的。我故意只回答标题中的问题,不想为作品做所有的工作。哇!这真的很有帮助
einsum
。我不知道这件事。O算符的原始形式是爱因斯坦符号。
G = df.to_numpy().reshape(-1,3,3)
array([[[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]],

       [[5, 6, 9],
        [8, 7, 4],
        [5, 2, 3]]], dtype=int64)

df['0'] = np.einsum('ijk,ikj->i', G, G) + np.einsum('ijk,ijk->i', G, G)
   a  b  c  d  e  f  g  h  i    0
0  1  2  3  4  5  6  7  8  9  546
1  5  6  9  8  7  4  5  2  3  594