【问题标题】:numpy boolean indexing multiple conditionsnumpy布尔索引多个条件
【发布时间】:2016-07-19 13:18:27
【问题描述】:

我有一个二维 numpy 数组,我使用的是 python 3.5。我开始学习布尔索引,这很酷。我可以用我的二维数组 arr 来做到这一点。 掩码 = arr > 127 arr[掩码] = 0

这很完美,但现在我正在尝试更改此逻辑以使用布尔索引

for x in range(arr.shape[0]):
    for y in range(arr.shape[1]):
        if arr[x,y] < -10:
            arr[x,y] = 0
        elif arr[x,y] < 15:
            arr[x,y] = arr[x,y] + 5
        else:
            arr[x,y] = 30

我为索引尝试了多个条件运算符,但出现以下错误:

ValueError: boolean index array should have 1 dimension boolean index array should have 1 dimension

我尝试了多个版本以尝试使其正常工作。这是产生 ValueError 的一次尝试。

 arr_temp = arr.copy()
 mask = arry_temp < -10
 mask2 = arry_temp < 15
 mask3 = mask ^ mask3
 arr[mask] = 0
 arr[mask3] = arry[mask3] + 5
 arry[~mask2] = 30 

我在 mask3 上收到错误消息。我是新手,所以我知道上面的代码在尝试解决它时效率不高。

任何提示将不胜感激。

【问题讨论】:

  • arr[arr &lt; -10] = 0arr[arr &lt; 15] = arr[arr &lt; 15] + 5arr[arr &gt;= 15] = 30?
  • 您的问题是您向我们展示了 old 代码,以及 new 代码的错误,而没有显示实际产生错误的代码。这不是很实用,因为我们必须猜测你实际写了什么才能得到那个错误。
  • 我认为您的蒙版创建需要一些帮助:mask1 = arr&lt;-10 mask2 = ~mask1 &amp; (arr&lt;15) mask3 = ~(mask1 | mask2),然后使用mask1,2,3 设置0, +5 and 30 值。

标签: python numpy


【解决方案1】:

这可能会有所帮助。考虑一个 numpy 浮点值数组 foo。

import numpy as np
foo=np.array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8])

foo 产量

array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 0.8])

这是获取 foo > 0.3 中的值的方式

foo[np.where( foo > 0.3)]

产量

array([0.4, 0.5, 0.6, 0.7, 0.8])

这是对多个条件执行相同操作的方法。在这种情况下,值 > 0.3 且小于 0.6。

foo[np.logical_and(foo > 0.3, foo < 0.6)]

产量

array([0.4, 0.5])

或者使用布尔掩码数组

mask_1 = foo > 0.3
mask_2 = foo < 0.6
mask_3 = np.logical_and(mask_1, mask_2)
mask_3

产生一个布尔掩码数组

array([False, False, False,  True,  True, False])

然后您可以使用它来切片数组

foo[mask_3]

产量

array([0.4, 0.5])

【讨论】:

    猜你喜欢
    • 2020-03-25
    • 2016-04-04
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    相关资源
    最近更新 更多