【问题标题】:Efficient symmetrical matrix data readout高效的对称矩阵数据读出
【发布时间】:2021-02-02 01:07:42
【问题描述】:

我有一个df 填充了一个对称的数据矩阵。现在我想提取高于某个值的数据标签(数据位置)。在正常的“for-loop”思维中,我会做这样的事情:

for j in range(df.shape[0]): 
    for i in range(j):
        if (df.iloc[j, i] >= value):
            print(df.index.values[i]) #do something
            print(df.index.values[j])

我有两个 for 循环的方法,效果非常好。问题在于它太慢了。数据大小可能会有所不同,并且有数百或数千列和行。因此我想使用一种有效的方式来处理数据:

import pandas as pd
import numpy as np

from scipy.spatial.distance import squareform

value = 0.6

df = pd.DataFrame(squareform(np.random.rand(10)))

print(df)

result = []

for j in range(df.shape[0]):
    result = np.where(value <= df.loc[j, :]) 


    for element in range(len(result[0])):
        print(result[0][element]) # do something

这基本上有效。但是我现在的问题是我不明白如何忽略矩阵的一个对称侧,因为我只需要一半的矩阵来进一步推进。

numpy.where() 确实加快了这个过程,但它让我有些困惑,因为它读出了一整行 df 并且我不知道如何进行探索。如果我使用result,我会得到双重职位,因为这是不必要的。

可能有什么我没看到的吗?或者也许是更好的方法?

提前致谢

【问题讨论】:

标签: python pandas numpy vectorization


【解决方案1】:

numpy 枚举

df = pd.DataFrame([
    [1, 2, 3, 4],
    [2, 3, 4, 5]
])

for (i, j), v in np.ndenumerate(df):
    do something

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    相关资源
    最近更新 更多