为什么不能 numpy.sum 对不同长度的数组的所有元素求和?

Why can't numpy.sum sum all elements of arrays with different length?

我一直在自学numpy,根据numpy手册,numpy.sum会对数组或类数组的所有元素求和。但是,我注意到如果这些数组的长度不同,numpy.sum 宁愿将它们合并而不是求和。

例如:

array_a = [1,2,3,4,5,6] # Same length 
array_b = [4,5,6,7,8,9]
np.sum([array_a, array_b])

60

array_a = [1,2,3,4,5] # Different length
array_b = [4,5,6,7,8,9]
np.sum([array_a, array_b])

[1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9]

为什么在后者中,numpy.sum没有按照应有的方式汇总所有元素?

In [128]: array_a = [1,2,3,4,5,6] # Same length 
     ...: array_b = [4,5,6,7,8,9]

这里给sum一个列表:

In [129]: np.sum([array_a, array_b])
Out[129]: 60

它首先做的是创建数组:

In [130]: np.array([array_a, array_b])
Out[130]: 
array([[1, 2, 3, 4, 5, 6],
       [4, 5, 6, 7, 8, 9]])

60是所有元素的总和。也可以给sum一个轴号:

In [131]: np.sum([array_a, array_b],axis=0)
Out[131]: array([ 5,  7,  9, 11, 13, 15])
In [132]: np.sum([array_a, array_b],axis=1)
Out[132]: array([21, 39])

这是正常的记录行为。

衣衫褴褛

In [133]: array_a = [1,2,3,4,5] # Different length
     ...: array_b = [4,5,6,7,8,9]

In [135]: x = np.array([array_a, array_b])
<ipython-input-135-5379fc40e73f>:1: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
  x = np.array([array_a, array_b])
In [136]: x.shape
Out[136]: (2,)
In [137]: x.dtype
Out[137]: dtype('O')
In [138]: np.sum(x)
Out[138]: [1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9]

这就是对列表求和 - 就像我们这样做一样:

In [139]: array_a + array_b
Out[139]: [1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9]

尽管名称如此,array_a 并不是一个数组。

对于对象 dtype,numpy 尝试将运算符(此处为添加)应用于元素。添加列表是连接。

如果我们从数组中创建参差不齐的数组:

In [140]: y = np.array([np.array(array_a), np.array(array_b)])
...
In [142]: y
Out[142]: array([array([1, 2, 3, 4, 5]), array([4, 5, 6, 7, 8, 9])], dtype=object)
In [143]: np.sum(y)
Traceback ...
ValueError: operands could not be broadcast together with shapes (5,) (6,) 

正在努力

In [144]: np.array(array_a) + np.array(array_b)

在学习 numpy 时,最好专注于数字多维数组,并将这些 ragged 对象 dtype 数组留到以后。在“正常”数组操作中有些细微差别并不明显。参差不齐的数组非常像列表,通常是用户错误的结果。故意制作参差不齐的数组通常不是一个有用的方法。

Why in the latter, numpy.sum did not sum up all the elements as it is supposed to do?

我无法解释为什么它没有 - 因为它确实存在。

[array_a, array_b] 包含两个元素 - 其中一个是列表 array_a,另一个是列表 array_b。后一种情况的结果与 array_a + array_b.

相同

在第一种情况下,Numpy 检测到它可以根据输入数据构建 two-dimensional、two-by-six Numpy 数组。在后一种情况下,它无法构建 two-dimensional 数组 - 根据定义,数组 必须 是矩形的(这就是为什么我们 不是 将该名称用于 built-in Python 数据结构,而是将其称为 list)。但是,它可以构建一个 一维 维数组,其中每个元素都是一个 Python 列表。 (是的,Numpy 数组允许存储 Python 个对象;dtype 将是 object,而 Numpy 不关心 确切的类型。在 numpy.sum 的情况下,它只会创建适当的请求来“添加”元素,其余的是 built-in Python 定义的责任。)

Explicit is better than implicit。如果您想使用数组,请首先创建它们:

array_a = np.array([1,2,3,4,5,6])