【问题标题】:python, numpy boolean array: negation in where statementpython,numpy布尔数组:在where语句中取反
【发布时间】:2011-02-14 12:16:27
【问题描述】:

与:

import numpy as np
array = get_array()

我需要做以下事情:

for i in range(len(array)):
    if random.uniform(0, 1) < prob:
        array[i] = not array[i]

数组是一个 numpy.array。

我希望我可以做类似的事情:

array = np.where(np.random.rand(len(array)) < prob, not array, array)

但我得到以下结果(指的是'非数组'):

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

为什么我可以取数组的值,但不能取反?

目前我解决了:

array = np.where(np.random.rand(len(array)) < prob, - array + 1, array)

但我觉得它真的很笨拙。

感谢您的帮助

ps:我不在乎语句是否修改了数组。我只需要操作的结果。

只是另一个问题:我想做这个改变有两个原因:可读性和效率。它有真正的性能改进吗?再次感谢您

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    我建议使用

    array ^= numpy.random.rand(len(array)) < prob
    

    这可能是获得所需结果的最有效方式。它将修改数组,使用“xor”将随机条件评估为True的条目反转。

    为什么我可以取数组的值,但不能取反?

    你也不能取数组的真值:

    >>> bool(array)
    ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
    

    not 运算符隐式尝试将其操作数转换为bool,然后返回相反的真值。不可能重载not 来执行任何其他行为。要否定 bools 的 NumPy 数组,您可以使用

    ~array
    

    或

    numpy.logical_not(array)
    

    或

    numpy.invert(array)
    

    虽然。

    【讨论】:

    • 还有n​​p.negative(array)
    【解决方案2】:

    putmask如果要替换选定的元素非常有效:

    import numpy as np
    
    np.putmask(array, numpy.random.rand(array.shape) < prob, np.logical_not(array))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-07
      • 2012-11-23
      • 2013-11-22
      • 1970-01-01
      • 2014-09-12
      • 2018-08-10
      • 1970-01-01
      • 2018-02-24
      相关资源
      最近更新 更多