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不允许创建列表为值的矩阵…使用numpyrestrape()
和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