51

有人可以准确解释一下axisNumPy 中的参数的作用吗?

我非常困惑。

我正在尝试使用该功能myArray.sum(axis=num)

起初我认为如果数组本身是 3 维,axis=0将返回三个元素,由同一位置的所有嵌套项的总和组成。如果每个维度包含五个维度,我希望axis=1返回五个项目的结果,依此类推。

然而事实并非如此,文档并没有很好地帮助我(他们使用 3x3x3 数组,所以很难说出发生了什么)

这是我所做的:

>>> e
array([[[1, 0],
        [0, 0]],

       [[1, 1],
        [1, 0]],

       [[1, 0],
        [0, 1]]])
>>> e.sum(axis = 0)
array([[3, 1],
       [1, 1]])
>>> e.sum(axis=1)
array([[1, 0],
       [2, 1],
       [1, 1]])
>>> e.sum(axis=2)
array([[1, 0],
       [2, 1],
       [1, 1]])
>>>

显然,结果并不直观。

4

6 回答 6

37

清楚地,

e.shape == (3, 2, 2)

对轴求和是一种归约操作,因此指定的轴消失。因此,

e.sum(axis=0).shape == (2, 2)
e.sum(axis=1).shape == (3, 2)
e.sum(axis=2).shape == (3, 2)

直观地说,我们正在沿着选定的轴“挤压”数组,并将被挤压在一起的数字相加。

于 2014-03-11T09:03:05.277 回答
17

axis 直观理解,请参考下图(来源:物理系,康奈尔大学

在此处输入图像描述

上图中(布尔)数组的形状shape=(8, 3). ndarray.shape将返回一个元组,其中条目对应于特定维度的长度。在我们的示例中,8对应于轴 0的长度, 而3对应于轴 1的长度。

于 2018-01-09T22:18:38.590 回答
11

如果有人需要这个视觉描述:

numpy 轴

于 2018-09-25T05:45:19.457 回答
3

可视化有很好的答案,但是纯粹从分析的角度思考可能会有所帮助。

您可以使用 numpy 创建任意维度的数组。例如,这是一个 5 维数组:

>>> a = np.random.rand(2, 3, 4, 5, 6)
>>> a.shape
(2, 3, 4, 5, 6)

您可以通过指定索引来访问此数组的任何元素。例如,这里是这个数组的第一个元素:

>>> a[0, 0, 0, 0, 0]
0.0038908603263844155

现在,如果您取出其中一个维度,您将获得该维度中的元素数量:

>>> a[0, 0, :, 0, 0]
array([0.00389086, 0.27394775, 0.26565889, 0.62125279])

当您应用sum带有axis参数的函数时,该维度会被消除,并且会创建维度小于原始维度的数组。对于新数组中的每个单元格,运算符将获取元素列表并应用归约函数来获取缩放器。

>>> np.sum(a, axis=2).shape
(2, 3, 5, 6)

现在您可以检查该数组的第一个元素是否是上述元素的总和:

>>> np.sum(a, axis=2)[0, 0, 0, 0]
1.1647502999560164

>>> a[0, 0, :, 0, 0].sum()
1.1647502999560164

具有特殊含义,axis=None可以展平数组并将函数应用于所有数字。

现在您可以考虑更复杂的情况,其中axis不仅仅是数字而是元组:

>>> np.sum(a, axis=(2,3)).shape
(2, 3, 6)

请注意,我们使用相同的技术来确定这种减少是如何完成的:

>>> np.sum(a, axis=(2,3))[0,0,0]
7.889432081931909

>>> a[0, 0, :, :, 0].sum()
7.88943208193191

您也可以使用相同的推理在数组中添加维度而不是减少维度:

>>> x = np.random.rand(3, 4)
>>> y = np.random.rand(3, 4)

# New dimension is created on specified axis
>>> np.stack([x, y], axis=2).shape
(3, 4, 2)
>>> np.stack([x, y], axis=0).shape
(2, 3, 4)

# To retrieve item i in stack set i in that axis 

希望这能让您对这个重要参数有通用和全面的理解。

于 2018-11-20T22:10:14.307 回答
1

有些答案过于具体,或者没有解决造成混淆的主要来源。这个答案试图通过一个简单的例子来提供一个更一般但更简单的概念解释。

混淆的主要来源与诸如“计算均值的轴”之类的表达式有关,它是函数参数的axis文档numpy.mean。“沿着它”到底是什么意思?“沿其”本质上意味着如果轴为 0,则对行求和(并除以行数,假设我们正在计算平均值),如果轴为 1,则对列求和。在轴为 0(或 1),行可以是标量或向量,甚至是其他多维数组。

In [1]: import numpy as np

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

In [3]: a
Out[3]: 
array([[1, 2],
       [3, 4]])

In [4]: np.mean(a, axis=0)
Out[4]: array([2., 3.])

In [5]: np.mean(a, axis=1)
Out[5]: array([1.5, 3.5])

因此,在上面的示例中,np.mean(a, axis=0)返回array([2., 3.])因为(1 + 3)/2 = 2and (2 + 4)/2 = 3。它返回一个包含两个数字的数组,因为它返回每列(并且有两列)的行的平均值。

于 2019-10-29T18:55:56.307 回答
1

第一个和第二个回复都非常适合理解 numpy 中的 ndarray 概念。我举一个简单的例子。

根据@debaonline4u 的这张图片

https://i.stack.imgur.com/O5hBF.jpg

假设,你有一个二维数组 - [1, 2, 3] [4, 5, 6]

在 numpy 格式中,它将是 -

c = np.array([[1, 2, 3], 
              [4, 5, 6]])  

现在,

c.ndim = 2 (rows/axis=0)
c.shape = (2,3) (axis0, axis1)
c.sum(axis=0) = [1+4, 2+5, 3+6] = [5, 7, 9] (sum of the 1st elements of each rows, so along axis0)
c.sum(axis=1) = [1+2+3, 4+5+6] = [6, 15]    (sum of the elements in a row, so along axis1)

因此,对于您的 3D 阵列, 3d Numpy 数组总和

于 2020-06-24T19:12:33.547 回答