您可能会考虑的另一种方法:
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 loopIn [6]: %timeit loop_compr_based(a)10000 loops, best of 3: 20.2 us per loopIn [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 loopIn [9]: %timeit loop_compr_based(a)10000 loops, best of 3: 30.8 us per loopIn [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 loopIn [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*2array([[1, 2, 3, 1, 2, 3], [1, 2, 1, 2], [1, 1]], dtype=object)
注意,numpy实际上通知我们这不是带有note的通常的numpy数组
dtype=object。
因此,最好只 列出 一个numpy数组并相应地使用它们。



