【问题标题】:Fast advanced indexing in numpynumpy 中的快速高级索引
【发布时间】:2016-12-21 22:46:53
【问题描述】:

我正在尝试使用花哨的索引尽快从大型 numpy 数组中获取切片。我很乐意返回视图,但 advanced indexing returns a copy

到目前为止,我已经尝试了 herehere 的解决方案,但没有任何乐趣。

玩具数据:

data = np.random.randn(int(1e6), 50)
keep = np.random.rand(len(data))>0.5

使用默认方法:

%timeit data[keep] 
10 loops, best of 3: 86.5 ms per loop

Numpy 采取:

%timeit data.take(np.where(keep)[0], axis=0)
%timeit np.take(data, np.where(keep)[0], axis=0)
10 loops, best of 3: 83.1 ms per loop
10 loops, best of 3: 80.4 ms per loop    

来自here的方法:

rows = np.where(keep)[0]
cols = np.arange(a.shape[1])
%timeit (a.ravel()[(cols + (rows * a.shape[1]).reshape((-1,1))).ravel()]).reshape(rows.size, cols.size)
10 loops, best of 3: 159 ms per loop

而如果您正在查看相同大小的视图:

%timeit data[1:-1:2, :]
1000000 loops, best of 3: 243 ns per loop

【问题讨论】:

    标签: python arrays numpy optimization indexing


    【解决方案1】:

    视图无法做到这一点。视图需要一致的步幅,而您的数据随机分散在原始数组中。

    【讨论】:

    • 很公平 - 我不一定要绑定到视图,任何类型的加速都会很棒。谢谢!
    • 您是否期待stackoverflow.com/questions/14386822/fast-numpy-fancy-indexing 未涵盖的新内容?
    • 是的,我希望有一些不同的东西 - 这些解决方案在这种情况下运行良好,因为它们在行和列上都进行切片,因此输出矩阵要小得多。在这里,我只对行进行切片,最终得到大量输出。
    • 我对@9​​87654322@ 和data[:500000].copy() 的时间安排在同一个球场。因此,时间大致与必须复制到结果中的项目数量成比例。 data[::2,:].copy() 时间更近了。 data[:,::2].copy() 慢一点。
    猜你喜欢
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 2020-10-19
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多