【问题标题】:Index numpy array with multiple ranges索引具有多个范围的numpy数组
【发布时间】:2026-01-19 20:50:01
【问题描述】:

想象一个数组a,它必须被idx中的多个范围索引:

In [1]: a = np.array([7,9,1,2,3,5,6,8,1,0,])
        idx = np.array([[0,3],[5,7],[8,9]])

        a, idx

Out[1]: (array([7, 9, 1, 2, 3, 5, 6, 8, 1, 0]),
         array([[0, 3],
                [5, 7],
                [8, 9]]))

当然,我可以编写一个简单的for 循环,从而产生所需的输出:

In [2]: np.hstack([a[i[0]:i[1]] for i in idx])

Out[2]: array([7, 9, 1, 5, 6, 1])

但我想要一种完全矢量化的方法。例如,我希望np.r_ 能提供一个解决方案。但是下面的代码不会产生所需的输出:

In [3]: a[np.r_[idx]]

Out[3]: array([[7, 2],
               [5, 8],
               [1, 0]])

而写出idx 确实会产生所需的输出。但是现实生活idx太大写不出来了:

In [4]: a[np.r_[0:3,5:7,8:9]]

Out[4]: array([7, 9, 1, 5, 6, 1])

【问题讨论】:

  • 也许这有帮助:*.com/questions/43413582/…
  • 感谢您的帮助!问题是,在现实生活中idx 可能会变得非常大,所以写出来不是一种选择
  • 不要在希望上使用np.r_之类的函数。阅读文档。我试图在链接的 SO 中涵盖您的所有选项。要么在切片后连接值,要么在索引之前连接切片。
  • @hpaulj 我对np.r_ 的希望是基于写出idx 就像a[np.r_[0:3,5:7,8:9]] 确实给出了所需的输出,但我只是不知道如何使用@987654337 @ 2D 数组直接在 np.r_ 上。无论如何,感谢您的帮助!但是,我不确定在哪里可以找到您描述的“链接 SO”?

标签: python arrays numpy indexing


【解决方案1】:

您可以尝试对slice 本身进行矢量化:

>>> slice_np = np.vectorize(slice)
>>> slice_idx = tuple(slice_np(idx[:, 0], idx[:, 1]))
>>> a[np.r_[slice_idx]]
 array([7, 9, 1, 5, 6, 1])

【讨论】:

  • np.hstack([np.arange(i,j) for i,j in idx]) 是一种更快的生成索引的方法。
  • @hpaulj 它可以扩展吗?例如idx = np.vstack([idx]*1000)
  • 你可以自己做一些时间测试,但有很多变化需要探索。对于较大的 idx slice_np 确实可以更好地扩展。但是,如果idx 是一个列表,而不是一个数组,则列表理解会更好,即使idx 很大。另一个权衡是在 OP 的 concatenate after index 与你的 concatenate 索引之间。正如我在链接的 SO 中指出的那样,这些替代方案的时间往往大致相同。没有真正的“矢量化”选项,将所有迭代移动到编译代码。
  • 我刚刚看了你的回答。你的观点被采纳了。