【问题标题】:How to get all indices for values of one array which are contained in another array?如何获取一个数组中包含在另一个数组中的值的所有索引?
【发布时间】:2018-11-05 11:33:14
【问题描述】:

假设我们有两个简单的 1d numpy 数组:

a = np.array([1, 1, 2, 5, 7, 8, 2, 4, 5, 6]) 
b = np.array([1, 5, 7])

现在我想要的是获取所有可能的索引,其中数组 b 中的每个值都包含在数组 a 中。

我们可以做例如以下:

idx = np.where(np.any(a.reshape((-1, 1))==b, axis=1))[0]

idxarray([0, 1, 3, 4, 8])(这是我真正想要的)。

现在我真的很好奇在 numpy 或任何其他库中是否已经有类似的函数来解决这个问题(我相信已经存在一个)。否则我会坚持现在的工作方法。

【问题讨论】:

  • 使用np.where(np.in1d(a, b))[0]

标签: python arrays numpy indexof


【解决方案1】:

np.isin/np.in1d -

np.flatnonzero(np.isin(a,b))
# or np.flatnonzero(np.in1d(a,b))

对于排序的b,使用np.searchsorted 可能会更高效-

sidx = np.searchsorted(b,a)
sidx[sidx==len(b)] = len(b)-1
out = np.flatnonzero(b[sidx]==a)

如果b 未排序,则对其进行排序,然后使用它代替b

【讨论】:

  • 所以不存在用于此的单个函数?
  • @PiMathCLanguage 不。打代码高尔夫什么的? :)
  • 可能有用/用于代码高尔夫。但我更好奇,也想为我的实际问题提供更高效的代码。
  • @PiMathCLanguage 代码长度不一定与性能相关。玩转 NumPy 工具和函数,看看哪一个最适合你。
  • 您的第二个示例确实要快得多。我还为这 3 种方法制作了一个测试脚本。你可以找到它here。您的性能更高的代码比您的第一个建议快约 2 倍。
猜你喜欢
  • 2018-03-28
  • 2014-05-24
  • 2021-11-26
  • 2015-04-03
  • 2017-09-19
  • 2021-06-24
  • 2018-03-03
  • 2017-03-20
  • 1970-01-01
相关资源
最近更新 更多