Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何对numpy对象数组的所有元素求和?_Python_Arrays_Numpy_Sum - Fatal编程技术网

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

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 但我想知道是否有更快/更简单的方法可以做到这一点 性能

我有一个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
但我想知道是否有更快/更简单的方法可以做到这一点


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

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,这样的问题通常由SO
numpy
社区来回答。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