python – 快速numpy花式索引

我的切片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我们将成为你的瓶颈.

上一篇:python – 熊猫标量值获取和设置:ix还是iat?


下一篇:c – 重载括号运算符[]以获取和设置