python - 用于有条件减去现有值的 Numpy boolean 索引掩码

标签 python arrays numpy boolean

我有一个数字在 (0, 180) 范围内的 numpy 数组。对于每个值,如果值 x 大于 90,我想将其替换为 180 - x

例如5 -> 5、50 -> 50、100 -> 80、175 -> 5。

因为 numpy 的强大之处在于它能够同时对整个数组进行操作,例如a = a + 1 将 a 中的所有项目增加 1,我使用 boolean 掩码尝试了以下操作:

>>> import numpy as np
>>> a = np.random.randint(180, size=(20))
>>> a
array([150, 136,  28,  77,   7, 165, 114,  71, 150,  86, 129, 156,  33,
        34,  91,  87, 105,   9,   5, 108])
>>> a[a > 90] = 180 - a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: NumPy boolean array indexing assignment cannot assign 20 input values to the 10 output values where the mask is true
>>>

此操作失败,因为掩码数组和原始数组的长度不匹配。 我该如何做到这一点(无需手动遍历数组)?

最佳答案

一种方法是使用np.where :

>>> a
array([172,  47,  58,  47, 162, 130,  16, 173, 125,  40,  25,  32, 123,
       142,  89,  29, 120,   2,  97, 116])
>>> np.where(a>90, 180-a, a)
array([ 8, 47, 58, 47, 18, 50, 16,  7, 55, 40, 25, 32, 57, 38, 89, 29, 60,
        2, 83, 64])

请注意,这会返回一个新数组,而不是修改现有数组。如果需要,您可以将其分配回 a,但引用原始数组的任何其他变量都不会“看到”该更改。

如果您在作业两侧选择适当的元素,您也可以执行您所做的操作:

>>> a[a>90] = 180 - a[a>90]
>>> a
array([ 8, 47, 58, 47, 18, 50, 16,  7, 55, 40, 25, 32, 57, 38, 89, 29, 60,
        2, 83, 64])

关于python - 用于有条件减去现有值的 Numpy boolean 索引掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33724157/

相关文章:

python - 没有数据混洗的一堆分类器的交叉验证返回垃圾

c++ - 你什么时候会使用数组而不是 vector/字符串?

python - 如何从字节制作一个 numpy ndarray?

python - np.savetxt 和多个数组

python - Pandas read_csv。使用 '^A' 作为分隔符

python - 获取当前执行的继承父类的子类的模块名称

python - Kinesis 消费者返回空记录(boto、python)

java - 对或多个整数进行排序。有没有比数组更好的方法?

java - 如何将 SQL 查询转换为 JSON 数组

python - 如何在 python 中为 excel 文件应用 if/else 逻辑? (日期)