作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用并加速花式索引来“连接”两个数组并在其中一个结果轴上求和。
像这样:
$ ipython
In [1]: import numpy as np
In [2]: ne, ds = 12, 6
In [3]: i = np.random.randn(ne, ds).astype('float32')
In [4]: t = np.random.randint(0, ds, size=(1e5, ne)).astype('uint8')
In [5]: %timeit i[np.arange(ne), t].sum(-1)
10 loops, best of 3: 44 ms per loop
有没有一种简单的方法可以加速 In [5]
中的语句?我应该使用 OpenMP 和类似 scipy.weave
或 Cython
的 prange
吗?
最佳答案
numpy.take
由于某种原因比花哨的索引快得多。唯一的技巧是它将数组视为平面数组。
In [1]: a = np.random.randn(12,6).astype(np.float32)
In [2]: c = np.random.randint(0,6,size=(1e5,12)).astype(np.uint8)
In [3]: r = np.arange(12)
In [4]: %timeit a[r,c].sum(-1)
10 loops, best of 3: 46.7 ms per loop
In [5]: rr, cc = np.broadcast_arrays(r,c)
In [6]: flat_index = rr*a.shape[1] + cc
In [7]: %timeit a.take(flat_index).sum(-1)
100 loops, best of 3: 5.5 ms per loop
In [8]: (a.take(flat_index).sum(-1) == a[r,c].sum(-1)).all()
Out[8]: True
我认为除此之外您将看到速度大幅提升的唯一其他方法是使用类似 PyCUDA 的东西为 GPU 编写自定义内核。 .
关于python - 快速(呃)numpy 花哨的索引和减少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11800075/
我有一个网站,其 Vanity URL 模块实现得非常糟糕,并且在某些时间段的负载非常高。由于url模块存在一些bug,系统需要经常重启。所以,我想重写一个该死的模块,使其变得更好并且更少错误....
我是一名优秀的程序员,十分优秀!