【问题标题】:Select several part of 2-d array by the attribute of another array通过另一个数组的属性选择二维数组的几个部分
【发布时间】:2016-06-09 09:33:40
【问题描述】:

这是我的问题。

  • a 是一个 100x100 形状的二维 numpy 数组,包含有限数

  • b 是一个 100x100 形状的二维 bool 数组,包含 True 和 False

我的目标:

当 b[i,j] == True 时,选择数组 a 的特定部分

我的代码在这里:

 select = a[np.array(np.where(b == True)).T]  

但结果显示某些索引超出了边界。

有人有实现这一目标的想法吗?

【问题讨论】:

  • a[b] 不能在这里工作吗?
  • 您希望输出是什么形状? a[b]a.flatten()[b.flatten()] 相同。它将返回一个长度等于 b 中真值数量的向量。

标签: python arrays numpy


【解决方案1】:

那是因为您正在转置索引数组。此外,您不需要将 np.where() 的结果转换为 numpy 数组,只需将其作为索引传递给第一个数组。

这是一个例子:

>>> b = np.random.choice([0, 1], size=(10,10))
>>> b
array([[0, 0, 0, 1, 0, 1, 1, 0, 0, 0],
       [0, 1, 1, 0, 0, 0, 0, 1, 1, 1],
       [1, 1, 1, 1, 1, 0, 0, 0, 1, 0],
       [1, 1, 0, 1, 0, 0, 1, 0, 0, 1],
       [0, 1, 0, 0, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 0, 1, 0, 0],
       [0, 1, 1, 1, 0, 0, 0, 0, 0, 0],
       [0, 1, 0, 0, 1, 1, 1, 0, 0, 1],
       [1, 0, 1, 0, 0, 1, 0, 1, 0, 0],
       [1, 0, 0, 1, 0, 1, 1, 0, 0, 1]])
>>> a = np.random.choice(100, size=(10,10))
>>> 
>>> a
array([[47, 90, 94, 11, 17, 65, 95, 57, 36, 43],
       [65, 82, 37, 93, 65, 32,  8, 47, 16, 12],
       [66, 60, 40, 90, 34, 30, 40,  2, 36, 65],
       [ 8, 53, 69,  0, 61, 60, 94, 37, 77, 43],
       [59, 47, 21, 93, 58,  0, 92, 26, 17, 44],
       [98, 16, 33, 56, 39, 30, 14, 93, 93, 58],
       [96, 40, 35, 17, 21, 70, 26,  0, 21, 81],
       [47,  4, 20, 82, 19, 89, 50, 26, 38,  4],
       [60,  3, 72, 56, 78, 55, 60, 53,  3, 87],
       [80,  1, 65,  2, 92, 92, 97, 17, 55, 67]])

>>> a[np.where(b)]
array([11, 65, 95, 82, 37, 47, 16, 12, 66, 60, 40, 90, 34, 36,  8, 53,  0,
       94, 43, 47, 58,  0, 92, 26, 17, 44, 98, 16, 33, 56, 39, 30, 93, 40,
       35, 17,  4, 19, 89, 50,  4, 60, 72, 55, 53, 80,  2, 92, 97, 67])

请注意,您不必将b==True 用作np.where 条件,当您传递布尔数组时,它将选择由python 的Truth Value Testing 确定的有效项目。

【讨论】:

    猜你喜欢
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 2015-04-12
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    相关资源
    最近更新 更多