在Numpy的求和函数中,轴= 0是做什么的?

时间:2016-10-23 06:03:55

标签: python arrays numpy

我正在学习Python,遇到过numpy.sum。它有一个可选参数axis。此参数用于获取逐列求和或逐行求和。当axis = 0我们意味着只对列进行求和时。例如,

a = np.array([[1, 2, 3], [4, 5, 6]])
np.sum(a, axis = 0)

这段代码产生输出:array([5, 7, 9]),很好。但如果我这样做:

a = np.array([1, 2, 3])
np.sum(a, axis = 0)

我得到结果:6,为什么?我不应该array([1, 2, 3])吗?

6 个答案:

答案 0 :(得分:12)

所有这一切都是numpy在第一个(第0个)和唯一的轴上相加。请考虑以下事项:

In [2]: a = np.array([1, 2, 3])

In [3]: a.shape
Out[3]: (3,)

In [4]: len(a.shape) # number of dimensions
Out[4]: 1

In [5]: a1 = a.reshape(3,1)

In [6]: a2 = a.reshape(1,3)

In [7]: a1
Out[7]: 
array([[1],
       [2],
       [3]])

In [8]: a2
Out[8]: array([[1, 2, 3]])

In [9]: a1.sum(axis=1)
Out[9]: array([1, 2, 3])

In [10]: a1.sum(axis=0)
Out[10]: array([6])

In [11]: a2.sum(axis=1)
Out[11]: array([6])

In [12]: a2.sum(axis=0)
Out[12]: array([1, 2, 3])

所以,更明确一点:

In [15]: a1.shape
Out[15]: (3, 1)

a1是二维的,“长”轴是第一个。

In [16]: a1[:,0] # give me everything in the first axis, and the first part of the second
Out[16]: array([1, 2, 3])

现在,沿第一轴求和:

In [17]: a1.sum(axis=0)
Out[17]: array([6])

现在,考虑一个不那么微不足道的二维案例:

In [20]: b = np.array([[1,2,3],[4,5,6]])

In [21]: b
Out[21]: 
array([[1, 2, 3],
       [4, 5, 6]])

In [22]: b.shape
Out[22]: (2, 3)

第一个轴是“行”。汇总沿行:

In [23]: b.sum(axis=0)
Out[23]: array([5, 7, 9])

第二轴是“列”。汇总沿着列:

In [24]: b.sum(axis=1)
Out[24]: array([ 6, 15])

答案 1 :(得分:10)

如果有人需要以下视觉描述:

numpy axis 0 and axis 1

答案 2 :(得分:2)

只是为多维数组提供了到np.sum(a,axis)的更简便快捷方式。如果沿一个轴求和,结果形状将以该轴为1。这就是我的意思;

 a1.shape = 2x3
 sum1 = a1.sum(axis=0)
 sum1.shape will be 1x3

sum2 = a1.sum(axis=1)
sum2.shape will be 2x1

从这里开始,您知道2x3x4x ...的形状沿轴0的总和是1x3x4x ...

答案 3 :(得分:0)

np.sum(a, axis=i)中的i轴是该数组形状的第i个索引(零索引)。

让我们尝试通过一些示例来了解这意味着什么:

a = np.array([1, 2, 3])
print (a.shape) #prints (3,) 
#so axis = 0 corresponds to 3 and axis = 1 corresponds to nothing

让我们看一下轴= 0和轴= 1对总和的作用:

sum = np.sum(a, axis=0) #sum = 6

因此,sum = np.sum(a, axis=0)将对a.shape的第0个索引所引用的所有数字求和,在这种情况下为3个数字。由于默认情况下numpy数组是行主的(这是表示行索引是在列索引之前指定的另一种方式),因此axis = 0会将形状所引用的三个数字相加。

sum = np.sum(a, axis=1) #gives an error

类似地,np.sum(a, axis=1)应该将np.shape的第一个索引所引用的所有数字相加,但是由于没有形状的第一个索引,因此会出现错误。

再举一个例子:

b = np.array([[1,2,3],
             [4,5,6]])
print(b.shape) #prints (2,3)
#axis = 0 corresponds to 2 and axis = 1 corresponds to 3

现在,让我们看看改变轴的作用:

sum = np.sum(b, axis=0) #sum = [5, 7, 9] of shape(3,)

我们知道轴= 0应该沿着形状的第一个索引求和,并且我们期望它沿着该轴找到两个数字(通过观察形状)。 [1+4, 2+5, 3+6]

sum = np.sum(b, axis=1) #sum = [6, 15] of shape(2,)

现在,总和沿轴= 1,从形状中我们可以看到,这是一个轴,沿该轴可以累加3个数字。所以,[1 + 2 + 3,4 + 5 + 6]

答案 4 :(得分:0)

axis是数组索引的索引。 数组索引从0开始,从右到左计数。

因此, np.sum(a, axis = 0)表示最右边的索引之和。

答案 5 :(得分:-1)

axis=0 表示其他轴是固定的,只有axis=0 是动态的。

a = np.array([[1, 2, 3], [4, 5, 6]])
sum(a[:,0]) => 5
sum(a[:,1]) => 7
sum(a[:,2]) => 9
np.sum(a,axis=0) => [5,7,9]

如果对形状为 (2, 3) 的矩阵求和,则得到形状为 (3, ) 的矩阵。

a = np.array([[1], [2], [3]])
sum(a[:,0]) => [6]
np.sum(a,axis=0) => [6]

如果对形状为(3, 1)的矩阵求和,则得到形状为(1, )的矩阵。

a = np.array([[1, 2, 3]])
sum(a[:,0]) => 1
sum(a[:,1]) => 2
sum(a[:,2]) => 3
np.sum(a,axis=0) => [1, 2, 3]

如果对形状为(1, 3)的矩阵求和,则得到形状为(3, )的矩阵。

a = np.array([1, 2, 3])
sum(a[:]) => 6
np.sum(a,axis=0) => 6

如果对形状为(3, )的矩阵求和,则得到一个数字。