假设我有一个名为purity_list
的pandas 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次,我的数组非常大,所以我需要一个矢量化版本。性能是关键。
答案 0 :(得分:1)
您的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]])
虽然我发现第一种方式更清楚。