您可能会考虑的另一种方法:
def iterative_numpy(a):
mask = a != 1
out = np.array([ a[i,mask[i]] for i xrange(a.shape[0]) ])
return out
Divakar的方法loop_compr_based
计算沿掩码行的总和以及该结果的累积总和。此方法避免了此类求和, 仍必须遍历的行a
。它还返回一个数组数组。这种烦恼out
必须用语法out[1][2]
而不是索引out[1,2]
。将时间与矩阵随机整数矩阵进行比较:
In [4]: a = np.random.random_integers(-1,1, size = (3,30))
In [5]: %timeit iterative_numpy(a)
100000 loops, best of 3: 11.1 us per loop
In [6]: %timeit loop_compr_based(a)
10000 loops, best of 3: 20.2 us per loop
In [7]: a = np.random.random_integers(-1,1, size = (30,3))
In [8]: %timeit iterative_numpy(a)
10000 loops, best of 3: 59.5 us per loop
In [9]: %timeit loop_compr_based(a)
10000 loops, best of 3: 30.8 us per loop
In [10]: a = np.random.random_integers(-1,1, size = (30,30))
In [11]: %timeit iterative_numpy(a)
10000 loops, best of 3: 64.6 us per loop
In [12]: %timeit loop_compr_based(a)
10000 loops, best of 3: 36 us per loop
如果列多于行,则iterative_numpy
胜出。当行数多于列数时,loop_compr_based
取胜但a
先移置将提高两种方法的性能。当尺寸比较相同时,loop_compr_based
最好。
在实现之外,需要特别注意的是,任何形状不均匀的numpy数组 是实际的数组,因为这些值不会占用内存的连续部分,而且,通常的数组操作将无法正常工作。预期。
举个例子:
>>> a = np.array([[1,2,3],[1,2],[1]])
>>> a*2
array([[1, 2, 3, 1, 2, 3], [1, 2, 1, 2], [1, 1]], dtype=object)
注意,numpy实际上通知我们这不是带有note的通常的numpy数组dtype=object
。
因此,最好只 列出 一个numpy数组并相应地使用它们。