【问题标题】:Chained comparison in NumPy? [duplicate]NumPy 中的链式比较? [复制]
【发布时间】:2020-06-19 17:49:32
【问题描述】:
>>> k
array([[0.58789735, 0.29830086],
       [0.09397728, 0.60737265]])
>>> k[k<0.1] = 1
>>> k[k>0.5] = 1
>>> k
array([[1.        , 0.29830086],
       [1.        , 1.        ]])

是否可以组合 k[0.1>K>0.5] = 1,当我尝试做类似的事情时,我得到以下错误

>>> k[0.1>k>0.5] = 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我在这里有什么选择?我尝试使用 .any 和 .all,它不像我在这里尝试的那样优雅。

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    numpy 中不允许链式比较。您需要使用bitwise operators 链接这些条件,然后执行boolean indexing。在这种情况下,您希望在满足任一条件时将值设置为 1,因此您需要按位 OR (|):

    k = np.array([[0.58789735, 0.29830086],
                  [0.09397728, 0.60737265]])
    
    k[(k<0.1)|(k>.5)] = 1
    
    print(k)
    [[1.         0.29830086]
     [1.         1.        ]]
    

    实际上在PEP 535 中建议使这成为可能,尽管它仍然被推迟。其中解释了为什么会发生这种情况。如问题中所述,以这种方式链接比较会产生:

    0.1>k>0.5
    

    ValueError:具有多个元素的数组的真值不明确。 使用 a.any() 或 a.all()

    这里的问题是,python 在内部将上述内容扩展为:

    0.1>k and k>0.5
    

    这是导致错误的原因,因为and 隐式调用bool,而NumPy 只允许对单个元素(不是带有size&gt;1 的数组)的布尔值进行隐式强制,因为带有许多值既不评估为True 也不评估为False。正是由于这种模糊性,这是不允许的,并且在布尔上下文中评估数组总是会产生 ValueError

    【讨论】:

      【解决方案2】:

      运行np.where(np.logical_or(k &lt; 0.1, 0.5 &lt; k), 1, k)。

      结果是:

      array([[1.        , 0.29830086],
             [1.        , 1.        ]])
      

      【讨论】:

        猜你喜欢
        • 2013-06-09
        • 2014-07-23
        • 2020-01-24
        • 2012-09-05
        • 2017-11-23
        • 2017-03-21
        • 1970-01-01
        • 2023-04-05
        • 2018-08-21
        相关资源
        最近更新 更多