首页 > 解决方案 > 索引具有多个范围的numpy数组

问题描述

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])

标签: pythonarraysnumpyindexing

解决方案


您可以尝试对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])

推荐阅读