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

时间:2019-05-01 05:17:23

标签: 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)

我想对所有元素求和,理想情况下应该给我32。如果我使用sum(a),则会收到错误消息。但是,我可以使用

获得结果
>> sum([np.sum(array) for array in a])
32

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

3 个答案:

答案 0 :(得分:1)

numpy.concatenatesum一起使用:

print (np.concatenate(a).sum())

print (np.sum(np.concatenate(a)))
32

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

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)

另一种解决方案:

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)

答案 1 :(得分:1)

虽然代码不错,但是您也可以使用numpy.concatenate连接数组,然后通过numpy.sum,python内置sumsum函数计算总和在numpy数组上

import numpy as np

a = np.array([np.arange(5), np.arange(2), np.arange(7)])

print(np.sum(np.concatenate(a)))
#32

print(sum(np.concatenate(a)))
#32

print(np.concatenate(a).sum())
#32

答案 2 :(得分:0)

您可以使用map

>>> sum(map(sum,a))
32