【问题标题】:Is there a faster method to use a 2d numpy array of booleans to select elements from a 2d array, but with a 2d output?是否有一种更快的方法来使用 2d numpy 布尔数组从 2d 数组中选择元素,但具有 2d 输出?
【发布时间】:2024-04-30 03:10:04
【问题描述】:

如果我有这样的数组

arr=np.array([['a','b','c'],
              ['d','e','f']])

还有一个相同形状的布尔数组,像这样:

boolarr=np.array([[False,True,False],
                  [True,True,True]])

我希望能够只从第一个数组中选择与布尔数组中的 True 相对应的元素。所以输出将是:

out=[['b'],
     ['d','e','f']]

我设法用一个简单的 for 循环解决了这个问题

out=[]
for n, i in enumerate(arr):
    out.append(i[boolarr[n]])
    out=np.array(out)

但问题是这个解决方案对于大型数组来说很慢,并且想知道是否有一个更简单的解决方案与 numpys 索引。只需使用普通符号 arr[boolarr] 即可返回单个平面数组 ['b','d','e','f']。我还尝试使用带有arr[:,[True,False,True]] 的切片,它保持形状但只能使用一个布尔数组。

【问题讨论】:

  • 您的结果数组不是数字 dtype 的有效形状,它必须是对象,此时,您不妨使用列表
  • 假设您及时获得了out 列表列表。然后呢?你打算用它做什么?使用这样的列表必然和生成它一样慢。
  • 如果您可以使用填充数组,例如np.array([['b','',''],['d','e','f']]) 我们可以建议一种相对快速的方式来分发这些 arr[boolarr] 值。但是您/我们需要更清楚地了解您真正需要什么。

标签: python arrays numpy indexing


【解决方案1】:

感谢 cmets。我误解了数组的工作原理。对于那些好奇的人,这是我的解决方案(我实际上是在处理数字):

arr[boolarr]=np.nan

然后我只是更改了函数的其余部分处理 nan 值的方式

【讨论】: