我正在学习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])
吗?
答案 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)
答案 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, )的矩阵求和,则得到一个数字。