给定起始位置和结束位置列表构造 Numpy 索引

Abi*_*iel 7 python numpy

我有两个大小相同的 numpy.array 对象(都是一维),其中一个包含起始索引位置列表,另一个包含结束索引位置列表(或者你可以说我有一个列表起始位置和窗口长度)。如果重要的话,由起始位置和结束位置形成的切片保证不重叠。我试图弄清楚如何使用这些开始和结束位置来形成另一个数组对象的索引,而不必使用循环。

例如:

import numpy as np
start = np.array([1,7,20])
end = np.array([3,10,25])
Run Code Online (Sandbox Code Playgroud)

想参考一下

somearray[1,2,7,8,9,20,21,22,23,24])
Run Code Online (Sandbox Code Playgroud)

Sve*_*ach 7

我会用

np.r_[tuple(slice(s, e) for s, e in zip(start, end))]
Run Code Online (Sandbox Code Playgroud)

编辑:这是一个不使用Python循环的解决方案:

def indices(start, end):
    lens = end - start
    np.cumsum(lens, out=lens)
    i = np.ones(lens[-1], dtype=int)
    i[0] = start[0]
    i[lens[:-1]] += start[1:]
    i[lens[:-1]] -= end[:-1]
    np.cumsum(i, out=i)
    return i
Run Code Online (Sandbox Code Playgroud)

这只会创建一个临时 NumPy 数组 ( lens),并且比任何其他解决方案都要快得多。