为什么不能 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])
我一直在自学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])