熊猫行的特征值

我有一个pandas DataFrame,其中的行表示对称矩阵分量。

                            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.dfDataFrame。下面是相关代码。

    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.syy,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.")
tycotyco 回答:熊猫行的特征值

您可以设置列的顺序以生成视图,然后使用.values(比np.array(..)更快)将其传递到数组,然后将eigvalsh应用于{{1 }}数组:

(n,3,3)
本文链接:https://www.f2er.com/3138313.html

大家都在问