Python 如何对numpy对象数组的所有元素求和?
我有一个numpy对象数组,它由几个普通的numpy数组组成 a=np.arange([np.arange(5),np.arange(2),np.arange(7)]) >>a 数组([0,1,2,3,4]),数组([0,1]),数组([0,1,2,3,4,5,6]),数据类型=对象 我想求所有元素的和,理想情况下应该是Python 如何对numpy对象数组的所有元素求和?,python,arrays,numpy,sum,Python,Arrays,Numpy,Sum,我有一个numpy对象数组,它由几个普通的numpy数组组成 a=np.arange([np.arange(5),np.arange(2),np.arange(7)]) >>a 数组([0,1,2,3,4]),数组([0,1]),数组([0,1,2,3,4,5,6]),数据类型=对象 我想求所有元素的和,理想情况下应该是32。如果我使用sum(a)我会得到一个错误。但是,我可以使用 >sum([a中数组的np.sum(数组)]) 32 但我想知道是否有更快/更简单的方法可以做到这一点 性能
32
。如果我使用sum(a)
我会得到一个错误。但是,我可以使用
>sum([a中数组的np.sum(数组)])
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)
虽然代码很好,但也可以使用来连接数组,然后通过、python内置或numpy数组上的
sum
函数计算总和
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
您可以使用
map
:
>>> sum(map(sum,a))
32
不,这很好,您正在使用python内置的sum来汇总更大的列表,其中包括
np.arange
列表的总和,并且您正在使用np.sum
来汇总各个numpy数组!如果你的代码可以工作,但你想改进它,在CodeReview上发布你可以删除sum
中的方括号sum(a中数组的np.sum(array)
@alec_a,这样的问题通常由SOnumpy
社区来回答。CR拥有更少的numpy
眼睛,并且倾向于更多地关注良好的编程风格。sum(a)
尝试执行a[0]+a[1]+a[2]
,并抱怨在2元素数组中添加5元素数组。+1用于性能分析。如果我的分析正确,重要的因素首先是使用np.sum
而不是sum
,其次是连接数组a
,而不是在其上循环?@ItamarMushkin-是的,在numpy中使用numpy函数比使用python函数更快,因为它是矢量化的。非常感谢。
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
>>> sum(map(sum,a))
32