【问题标题】:Fast slicing of numpy array multiple times多次快速切片numpy数组
【发布时间】:2015-02-10 05:16:26
【问题描述】:

我有类似 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]]

【问题讨论】:

    标签: python numpy slice


    【解决方案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_ 连接切片 - 与您的第一个相比没有太大改进。

    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

    【讨论】:

      猜你喜欢
      • 2019-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 2017-09-10
      • 2019-04-02
      相关资源
      最近更新 更多