当我沿任一方向求一个方形numpy数组时,为什么形状保持不变?

时间:2017-12-01 10:35:00

标签: python numpy

当我沿轴= 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,)

4 个答案:

答案 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])

这个惯例被接受了,没有什么是非常困难的。