我有一个由几个普通的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
但是我想知道是否有更快/更简单的方法来做到这一点?
答案 0 :(得分:1)
将numpy.concatenate
与sum
一起使用:
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内置sum或sum
函数计算总和在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