【发布时间】:2019-11-08 11:29:18
【问题描述】:
我有一个pandasDataFrame,其中的行代表一个对称矩阵分量。
sxx syy szz sxy syz sxz
NodeID time
1500000 20921.0 2504729.0 -16524560.0 -3966213.0 5058878.0 8026349.0 390275.7
20923.0 2541577.0 -16459500.0 -3930280.0 5047995.0 8019404.0 393201.3
20925.0 2582004.0 -16384690.0 -3891037.0 5035703.0 8011226.0 396850.2
20927.0 2618859.0 -16313310.0 -3855520.0 5024095.0 8003384.0 400578.7
20933.0 2703961.0 -16133460.0 -3773937.0 4995101.0 7985394.0 411183.2
矩阵将如下所示。
[[sxx, sxy, sxz],
[sxy, syy, syz],
[sxz, syz, szz]]
从每一行计算特征值的最快方法是什么?
我尝试在每一行上“应用”np.linalg.eigvalsh。但是,当我有接近一百万行时,这需要相当长的时间。
编辑
为了给出完整的上下文,我还应该提到这个DataFrame 是对象定义的一部分。 object.df 是 DataFrame。下面是相关代码。
def s1(self):
"""Returns the first principal stress for every node every timepoint"""
return self.df.apply(principal, axis=1, label="s1")
def principal(s, label):
principals = np.linalg.eigvalsh(
np.array(
[s.sxx, s.sxy, s.sxz, s.sxy, s.syy, s.syz, s.sxz, s.syz, s.szz]
).reshape(3, 3)
)
if label.lower() == "s3":
return principals[0]
elif label.lower() == "s2":
return principals[1]
elif label.lower() == "s1":
return principals[2]
else:
raise ValueError("Invalid Input, choose from s1, s2, or s3.")
【问题讨论】:
-
你如何将它应用到每一行?贴出代码?您是否首先将行重塑为对称方阵?
-
实际上这个数据框是对象定义的一部分。我将发布相关信息作为问题的一部分。
-
@DrBwts,是的。数据框中的每一行实际上是对称矩阵的上半部分。
-
您可以取消
.reshape(3,3)并将矩阵定义为np.array([[s.sxx, s.sxy, s.sxz], [s.sxy, s.syy, s.syz], [s.sxz, s.syz, s.szz]])以开始
标签: python pandas numpy linear-algebra eigenvalue