多次快速切割numpy数组

时间:2015-02-10 05:16:26

标签: python numpy slice

我有类似np.arange([100000])的东西,我需要多次在两个索引之间检索数据。目前我正在运行这个很慢的

data = np.arange([100000])
# This array usually contains thousands of slices
slices = np.array( [
       [1, 4],
       [10,20],
       [100,110],
       [1000,1220]
])

# One way i have been doing it
np.take(data, [i for iin, iout in slices for idx in range(iin, iout)])
# The other way
[data[iin:iout] for iin, iout in slices]

两种方式都很慢。我需要这个非常快。我在找这样的东西。

data[slices[:,0], slices[:,1]]

1 个答案:

答案 0 :(得分:1)

slicesdata = np.arange(2000)

的一些时间安排

您的take,已更正:

In [360]: timeit np.take(data, [idx for iin, iout in slices for idx in range(iin,iout)])
10000 loops, best of 3: 92.5 us per loop

In [359]: timeit data[[idx for iin, iout in slices for idx in range(iin,iout)]]
10000 loops, best of 3: 92.2 us per loop

你的第二个版本(已更正) - 相当好一点

In [361]: timeit np.concatenate([data[iin:iout] for iin,iout in slices])
100000 loops, best of 3: 15.8 us per loop

使用np.r_连接切片 - 与第1次切片相比没有太大改进。

In [362]: timeit data[np.r_[tuple([slice(i[0],i[1]) for i in slices])]]
10000 loops, best of 3: 79 us per loop
In [363]: timeit np.r_[tuple([slice(i[0],i[1]) for i in slices])]
10000 loops, best of 3: 67.5 us per loop

构建索引需要花费大量时间。

当然,这个规模的排名可能会因为一个大规模的问题而发生变化。

由于您的切片长度不同,因此没有希望以矢量化的方式生成它们,即并行'。我不知道cython实施是否能加快速度。

来自早期类似问题的更多时间安排 https://stackoverflow.com/a/11062055/901925