我有类似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]]
答案 0 :(得分:1)
slices
和data = 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