我的切片numpy数组的代码(通过花哨的索引)非常慢.它目前是计划的瓶颈.
a.shape
(3218, 6)
ts = time.time(); a[rows][:, cols]; te = time.time(); print('%.8f' % (te-ts));
0.00200009
获取由矩阵a的行’rows’和列’col’的子集组成的数组的正确numpy调用是什么? (事实上,我需要这个结果的转置)
解决方法:
如果使用花式索引和广播切片,您可以加快速度:
from __future__ import division
import numpy as np
def slice_1(a, rs, cs) :
return a[rs][:, cs]
def slice_2(a, rs, cs) :
return a[rs[:, None], cs]
>>> rows, cols = 3218, 6
>>> rs = np.unique(np.random.randint(0, rows, size=(rows//2,)))
>>> cs = np.unique(np.random.randint(0, cols, size=(cols//2,)))
>>> a = np.random.rand(rows, cols)
>>> import timeit
>>> print timeit.timeit('slice_1(a, rs, cs)',
'from __main__ import slice_1, a, rs, cs',
number=1000)
0.24083110865
>>> print timeit.timeit('slice_2(a, rs, cs)',
'from __main__ import slice_2, a, rs, cs',
number=1000)
0.206566124519
如果按照百分比来考虑,做一些比15%快的东西总是好的,但在我的系统中,对于阵列的大小,这需要40美元来做切片,并且很难相信操作采取240我们将成为你的瓶颈.