如何在 numpy 中逻辑组合整数索引?

nro*_*rob 5 python numpy

有谁知道如何在 numpy 中组合整数索引?具体来说,我已经得到了几个结果np.where,我想提取它们之间的共同元素。

对于上下文,我试图用每个单元格边界值之间的元素数量填充一个大型 3d 数组,即我有各个事件的记录,包括它们的时间、纬度和经度。我想将其网格化为 3D 频率矩阵,其中维度为时间、纬度和经度。

我可以循环数组元素np.where(timeCondition & latCondition & lonCondition),使用 where 结果的长度进行 , 填充,但我认为这效率非常低,因为您必须重复很多 s where

更好的方法是只拥有每个维度中每个单元格的位置列表,然后循环遍历它们的逻辑组合?

HYR*_*YRY 4

正如@ali_m所说,使用按位应该更快,但要回答你的问题:

  • 调用ravel_multi_index()将多维索引转换为一维索引。
  • 调用intersect1d()以获取两种情况下的索引。
  • 调用unravel_index()将 1-dim 索引转换回多维索引。

这是代码:

import numpy as np

a = np.random.rand(10, 20, 30)

idx1 = np.where(a>0.2)
idx2 = np.where(a<0.4)

ridx1 = np.ravel_multi_index(idx1, a.shape)
ridx2 = np.ravel_multi_index(idx2, a.shape)
ridx = np.intersect1d(ridx1, ridx2)
idx = np.unravel_index(ridx, a.shape)

np.allclose(a[idx], a[(a>0.2) & (a<0.4)])
Run Code Online (Sandbox Code Playgroud)

或者您可以ridx直接使用:

a.ravel()[ridx]
Run Code Online (Sandbox Code Playgroud)

  • 您确实回答了我的问题,但事实证明我以不同的方式解决了问题。我发现最有效的解决方案是跳过 np.where 方面。即我为每个维度创建了一个布尔数组列表,然后用&符号将它们逻辑组合起来。 (2认同)