当我沿轴= 0(即行)求和时,我期待形状为(1,3)。但两种情况下的形状保持不变。那是为什么?
>>> arr = np.arange(9).reshape(3,3)
>>> arr
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> arr.sum(1)
array([ 3, 12, 21])
>>> arr.sum(1).shape
(3,)
>>> arr.sum(0)
array([ 9, 12, 15])
>>> arr.sum(0).shape
(3,)
答案 0 :(得分:4)
numpy.sum
返回:
与
a
形状相同的数组,指定轴已移除。
在两种情况下都删除了一个轴,您将留下单个元组。
2轴 - 1个指定轴= 1轴
然而,将keepdims
作为True
传递给两者会给出不同的形状,保留原始数组中的所有轴,并沿指定轴进行相应的长度变化:
>>> arr.sum(axis=0, keepdims=True)
array([[ 9, 12, 15]])
>>> arr.sum(axis=1, keepdims=True)
array([[ 3],
[12],
[21]])
答案 1 :(得分:1)
因为沿ND阵列的轴求和产生(N-1)D阵列。如果您考虑
,这是有道理的np.sum([1,2,3]) == 6 # a 0D 'array'
如果您想将arr.sum(1)
转换为(1, 3)
或(3, 1)
2D数组,请使用
s = arr.sum(0)[np.newaxis, :] # (1, 3)
或
s = arr.sum(1)[:, np.newaxis] # (3, 1)
答案 2 :(得分:0)
根据the documentation,这是你得到的:
返回:
sum_along_axis:ndarray
与a相同形状的数组,删除指定的轴。如果a是0-d数组,或者如果axis是None,则返回标量。如果指定了输出数组,则返回对out的引用。
arr
的形状确实是(3,3)
并且是二维的。如果你移除一个轴,你将留下(3,)
的形状 - 这是一维的。
形状为(1,3)
的数组仍有两个轴。
答案 3 :(得分:0)
numpy.arrays
的逻辑与Matlab或数学不同。来自here:
向量处理(一维数组)对于数组,向量 形状1xN,Nx1和N都是不同的东西。操作如 A [:,1]返回形状N的一维数组,而不是a 二维阵列形状Nx1。在一维上转置 数组什么都不做。
Numpy故事不是从线性代数开始的,所以一维对象总是水平,不能转置,等等。第一次与不同的背景混淆,但在其他领域有很多优势。在numpy 2-dim数组是列(dim1)的行(dim0),就像矩阵一样,但选择一行或一列总是返回...一行!
举个例子:
In [1]: m=np.arange(6).reshape(3,2)
In [2]: m
Out[2]:
array([[0, 1],
[2, 3],
[4, 5]])
In [3]: m[0,:]
Out[3]: array([0, 1])
In [4]: m[:,0]
Out[4]: array([0, 2, 4])
这个惯例被接受了,没有什么是非常困难的。