如何对numpy对象数组的所有元素求和?

ѕня*_*gнι 2 python arrays numpy sum

我有一个由几个普通的 numpy 数组组成的 numpy 对象数组

>> a = np.array([np.arange(5), np.arange(2), np.arange(7)])
>> a
array([array([0, 1, 2, 3, 4]), array([0, 1]), array([0, 1, 2, 3, 4, 5, 6])], dtype=object)
Run Code Online (Sandbox Code Playgroud)

我想总结所有元素,理想情况下应该给我32. 如果我使用sum(a)我得到一个错误。但是,我可以使用得到结果

>> sum([np.sum(array) for array in a])
32
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有任何更快/更简单的方法来做到这一点?

jez*_*ael 5

使用numpy.concatenatesum

print (np.concatenate(a).sum())
Run Code Online (Sandbox Code Playgroud)
print (np.sum(np.concatenate(a)))
32
Run Code Online (Sandbox Code Playgroud)

性能:取决于嵌套数组的数量和数组中的值的数量,因此最好在实际数据中进行测试:

a = np.array([np.arange(5), np.arange(2), np.arange(7)] * 1000) 
#print (a)

In [40]: %timeit np.concatenate(a).sum()
830 µs ± 22.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [41]: %timeit (np.sum(np.concatenate(a)))
835 µs ± 33.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

#original solution 
In [42]: %timeit sum([np.sum(array) for array in a])
15.3 ms ± 85.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Run Code Online (Sandbox Code Playgroud)

另一种解决方案:

In [43]: %timeit sum(np.sum(array) for array in a)
17.4 ms ± 2.27 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [44]: %timeit (sum(np.concatenate(a)))
2.28 ms ± 143 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Run Code Online (Sandbox Code Playgroud)