首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >求最大正值或最小负值的向量化版本

求最大正值或最小负值的向量化版本
EN

Stack Overflow用户
提问于 2017-06-15 23:53:40
回答 1查看 160关注 0票数 1

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

代码语言:javascript
复制
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数组进行比较,如下所示:

代码语言:javascript
复制
In[]: purities
Out[]: 
array([-0.2, 0.2, -0.8]) 

我现在最接近的矢量化代码是:

代码语言:javascript
复制
purity_list = np.where(np.absolute(purity_list) > np.absolute(purities), 
                       purity_list, purities)

当我运行该代码时,我将得到以下内容:

代码语言:javascript
复制
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

我真正想要的是一些稍微不同的东西。我这里有一个非矢量化的逻辑:

代码语言:javascript
复制
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])

这样做的结果是:

代码语言:javascript
复制
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次,我的数组非常大,所以我需要一个矢量化版本。表演是这里的关键。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-16 00:47:14

在您的np.where版本中,逻辑是不完全正确的。考虑一下,当一个负值比一个正值要大的时候会发生什么。不过,工具的选择是合理的。因此,您所需要做的就是纠正这种情况,以便更好地匹配您的目标:

代码语言:javascript
复制
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觉得很傻,那么可以将逻辑组合起来:

代码语言:javascript
复制
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]])

虽然我发现第一条路更清晰。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44578733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档