假设我有一个名为purity_list的熊猫DataFrame,如下所示:

In[]: purity_list
Out[]:
     48    49    50
2   0.1   0.9   0.3
A   0.2  -0.5  -0.6
4   0.3   0.8   0.9


我想将其与另一个numpy数组进行比较,并获得最大的+ ve值,如果没有+ ve值,我希望使用最低的-ve值。

因此,假设我将其与名为purities的numpy数组进行比较,如下所示:

In[]: purities
Out[]:
array([-0.2, 0.2, -0.8])


我现在拥有的最接近的矢量化代码是这样的:

purity_list = np.where(np.absolute(purity_list) > np.absolute(purities),
                       purity_list, purities)


当我运行该代码时,将得到以下信息:

In[]: purity_list
Out[]:
     48    49    50
2  -0.2   0.9  -0.8
A  -0.2  -0.5  -0.8
4   0.3   0.8   0.9


我真正要寻找的是略有不同的东西。我这里有非向量化逻辑:

for i, v1 in enumerate(purity_list):
    for j, v2 in enumerate(v1):
        if v2 > 0 or purities[j] > 0:
            purity_list.iloc[i, j] = np.max(purity_list.iloc[i, j], purities[j])
        else:
            purity_list.iloc[i, j] = np.min(purity_list.iloc[i, j], purities[j])


结果将是:

In[]: purity_list
Out[]:
     48    49    50
2   0.1   0.9   0.3
A   0.2   0.2  -0.8
4   0.3   0.8   0.9


这是我想要的结果。我要重复该语句超过100,000次,并且数组确实很大,因此我需要向量化版本。性能是关键。

最佳答案

在您的np.where版本中,逻辑并不完全正确。考虑当负值的大小大于与之比较的正值时发生的情况。但是,工具的选择是合理的。因此,您需要做的就是纠正条件以更好地满足您的目标:

np.where((purity_list < 0) & (purities < 0),
         np.where(purity_list < purities, purity_list, purities),
         np.where(purity_list > purities, purity_list, purities))
Out[42]:
array([[ 0.1,  0.9,  0.3],
       [ 0.2,  0.2, -0.8],
       [ 0.3,  0.8,  0.9]])


如果嵌套np.where感觉很愚蠢,则可以将逻辑组合在一起:

np.where(((purity_list < 0) & (purities < 0) & (purity_list < purities))
         |(((purity_list > 0) | (purities > 0)) & (purity_list > purities)),
         purity_list, purities)
Out[43]:
array([[ 0.1,  0.9,  0.3],
       [ 0.2,  0.2, -0.8],
       [ 0.3,  0.8,  0.9]])


尽管我发现第一种方法更清晰。

关于python - 查找最大正值或最小负值的向量化版本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44578733/

10-12 22:43