Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python NumPy中的轴参数是如何工作的?_Python_Arrays_Numpy_Multidimensional Array_Numpy Ndarray - Fatal编程技术网

Python NumPy中的轴参数是如何工作的?

Python NumPy中的轴参数是如何工作的?,python,arrays,numpy,multidimensional-array,numpy-ndarray,Python,Arrays,Numpy,Multidimensional Array,Numpy Ndarray,有人能准确地解释NumPy中的轴参数的作用吗 我非常困惑 我正在尝试使用函数myArray.sum(axis=num) 起初我认为,如果数组本身是三维的,axis=0将返回三个元素,由位于同一位置的所有嵌套项的总和组成。如果每个维度包含五个维度,我希望axis=1返回五个项目的结果,依此类推 然而,事实并非如此,文档也不能很好地帮助我解决问题 以下是我所做的: >>> e array([[[1, 0], [0, 0]], [[1, 1],

有人能准确地解释NumPy中的
参数的作用吗

我非常困惑

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

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

然而,事实并非如此,文档也不能很好地帮助我解决问题

以下是我所做的:

>>> 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]])
>>>
显然,结果并不直观。

显然

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)

要直观地理解轴,请参考下图(来源:)


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

如果有人需要此视觉描述:


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

可以使用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])
>>> 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 
当您使用
axis
参数应用像
sum
这样的函数时,将消除该维度,并创建小于原始维度的维度数组。对于新数组中的每个单元格,操作符将获得元素列表,并应用缩减函数来获得一个定标器

>>> 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
您也可以使用相同的推理在数组中添加维度,而不是减少维度:

>>> a[0, 0, :, 0, 0]
array([0.00389086, 0.27394775, 0.26565889, 0.62125279])
>>> 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 

希望这能让您对这一重要参数有一个全面的了解。

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

造成混淆的主要原因与诸如“计算平均值的轴”之类的表达式有关,这是
numpy.mean
函数的参数
Axis
的文档。“沿哪个方向”到底是什么意思?“沿其”本质上意味着,如果轴为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)
返回
数组([2,3.])
,因为
(1+3)/2=2
(2+4)/2=3
。它返回一个由两个数字组成的数组,因为它返回每列(有两列)行的平均值。

第一个和第二个回复对于理解numpy中的ndarray概念非常有用。我举一个简单的例子

根据@Debanline4u的这张图片

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

以numpy格式,它将是-

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

所以对于你的3D阵列,

我不明白-为什么指定的轴会消失?如果有一个向量,并对其元素求和,则会得到一个数字。从一维数组可以得到一个标量。这就是它消失的方式。@CodyBugstein轴消失是因为
sum
是一个聚合操作,这意味着当你对
n
元素求和时,你只得到1。因此,求和后,沿该轴的所有元素都将折叠为一个元素。想象一下,你正在把一张长方形的纸揉成一条水平线(或一种雪茄)。如果在工作表上绘制了一个数字网格,则所有垂直元素最终都会合并在一起;只剩下水平维度。嘿,马丁!谢谢你的回答!!我真的搞砸了轴参数是怎么工作的。但是这个5行的精确答案让一切都非常清楚。现在我得到了一个维度ti消失了!!在这里你也可以遵循:这是一个更好的理解,而不仅仅是让一个轴消失。轴消失是结果,而不是原因。如果您希望轴消失,那么当您尝试使用
排序
之类的操作时,您会感到恼火。