2014-11-06 41 views
1

我有不同形状的numpy阵列的numpy.array。 当我打电话np.sum(my_array)我得到这个错误:总结所有来自阵列内不同形状的numpy子阵列的所有值

Traceback (most recent call last): 
return umr_sum(a, axis, dtype, out, keepdims) 
ValueError: operands could not be broadcast together with shapes (13,5) (5,3) 

所有我想要的是在所有阵列状总和(my_array)所有值之和=一些浮点数

有一些参数我错过了还是另一种方法? 我只能想到这样的事情

np.sum([np.sum(a) for a in my_array]) 

这是一个最佳的方法是什么?

更新:

print(type(my_array)) 
print((my_array).shape) 
print([(type(sub_array), sub_array.shape) for sub_array in my_array]) 

输出:

<class 'numpy.ndarray'> 
(2,) 
[(<class 'numpy.ndarray'>, (13, 5)), (<class 'numpy.ndarray'>, (5, 3))] 
+0

什么是my_array?它是一个包含numpy数组的Python列表吗? – jozzas 2014-11-06 21:30:25

+0

@jozzas这也是一个numpy.array – userqwerty1 2014-11-06 21:32:48

+0

这是什么样的ndarray包含不同形状的其他ndarrays?请为我们打印'type(my_array)'的结果。 – ballsatballsdotballs 2014-11-06 21:35:16

回答

4

使用发电机应在大多数情况下更好地:

np.sum(np.sum(a) for a in my_array) 

没有 '[...]'你不会创建一个列表。

%timeit np.sum(np.sum(a) for a in my_array) 

100000循环,最好的3:每圈5.73微秒

%timeit np.sum([np.sum(a) for a in my_array]) 

100000循环,最好的3:每圈9.97微秒

+0

哇。不知道我可以省略'[..]'谢谢。你如何做出这个时间?我已经尝试过但不能像你的那样工作。请,你能告诉或发布链接吗? – userqwerty1 2014-11-06 22:04:00

+1

我在一个IPython Notebook中写了这个。你应该看看这个,它包含在安装带有anaconda或enthougt的python时。 %timeit可以在那里使用。 – espang 2014-11-06 22:08:08

+0

哇。尼斯。谢谢。 – userqwerty1 2014-11-06 22:12:06

0
a = np.array(map(np.arange, range(16, 32))) 

Eyy![28]: %timeit np.sum(map(np.sum, a)) 
10000 loops, best of 3: 90.5 µs per loop 

Eyy![29]: %timeit np.sum(np.sum(b) for b in a) 
10000 loops, best of 3: 86 µs per loop 

Eyy![30]: %timeit np.sum([np.sum(b) for b in a]) 
10000 loops, best of 3: 90.2 µs per loop 

也注意到,它可以多次如果您事先知道最大尺寸,则更容易拥有零填充的numpy阵列。