NumPy的轴参数如何工作?

时间:2014-03-11 08:47:57

标签: python arrays numpy multidimensional-array numpy-ndarray

有人可以准确解释NumPy中axis参数的作用吗?

我非常困惑。

我正在尝试使用函数myArray.sum(axis=num)

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

然而情况并非如此,文档并没有很好地帮助我(they use a 3x3x3 array so it's hard to tell what's happening)

这就是我的所作所为:

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

显然结果并不直观。

6 个答案:

答案 0 :(得分:21)

显然,

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)

答案 1 :(得分:9)

要直观地了解axis,请参阅下图(来源:Physics Dept, Cornell Uni

enter image description here

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

答案 2 :(得分:3)

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

numpy axis

答案 3 :(得分:1)

某些答案过于具体或无法解决造成混乱的主要根源。该答案试图通过一个简单的例子提供对该概念的更一般但简单的解释。

混淆的主要根源与诸如“计算平均值的轴”之类的表达式有关,这是axis函数的自变量numpy.mean的文档。 “连这”在这里到底意味着什么? “ Along that”从本质上讲意味着,如果轴为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 = 2(2 + 4)/2 = 3。它返回两个数字的数组,因为它返回每一列(并且有两列)的行均值。

答案 4 :(得分:0)

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

您可以使用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的特殊含义是使数组变平并在所有数字上应用函数。

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

>>> 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

您也可以对数组中的添加维度使用相同的推理,而不是使用 reducing 维度:

>>> 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 

希望这可以使您对该重要参数有一个通用而全面的理解。

答案 5 :(得分:0)

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

根据@ debaonline4u的图片

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

假设您有一个2D数组- [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 array sum

相关问题