Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.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_Numpy - Fatal编程技术网

Python numpy轴编号的明确权威解释?

Python numpy轴编号的明确权威解释?,python,numpy,Python,Numpy,我对术语axis在numpy中的确切含义以及这些结构是如何编号的矛盾解释感到困惑 这里有一个解释: 轴是为具有多个维度的阵列定义的。 二维数组有两个对应的轴: 第一个垂直向下跨行运行(轴0),并且 第二个水平穿过柱(轴1) 所以,在这个3x4矩阵中 >>> b = np.arange(12).reshape(3,4) >>> b array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9,

我对术语axis在numpy中的确切含义以及这些结构是如何编号的矛盾解释感到困惑

这里有一个解释:
轴是为具有多个维度的阵列定义的。
二维数组有两个对应的轴:
第一个垂直向下跨行运行(轴0),并且
第二个水平穿过柱(轴1)

所以,在这个3x4矩阵中

>>> b = np.arange(12).reshape(3,4)
>>> b
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
(轴0)是3行
(轴1)为4列

所以规则可能是

在MxN矩阵中,(轴0)是M,(轴1)是N

这是正确的吗

所以,在三维矩阵AxBxC中 (轴0)是一个
(轴1)是B
(轴2)为C轴


这是对的吗?

除了

轴是为具有多个维度的阵列定义的

轴也为一维数组定义-只有一个(即轴0)


一个直观的思考轴的方法是考虑在一个轴上应用一个约化操作,如求和时会发生什么。例如,假设我有一些数组

x

x = np.arange(60).reshape(3, 4, 5)
如果我计算
x.sum(0)
我在第一个维度(即轴0)上“折叠”
x
,因此我得到一个
(4,5)
数组。同样地,
x.sum(1)
给我一个
(3,5)
数组,
x.sum(2)
给我一个
(3,4)
数组


一个整数索引到一个
x
的单轴上,也会给我一个少一个轴的输出。例如,
x[0,:,:]
给了我
x
的第一个“行”,它的形状是
(4,5)
x[:,0,:]
给了我形状是
(3,5)
的第一个“列”,而
x[:,:,0]
给了我形状是
x
的第三维第一个切片(3,4)

虽然可以在3D中想象这一点,但我个人觉得当我们进入4D或5D时,很难想象。。。所以我决定放弃,而是从实现的角度考虑这个问题。基本上,它有N个嵌套的
for
循环,如果我们想减少一个特定的轴,我们只需要处理该轴的for循环。例如,如果给定3x3x3张量,
axis=0
是[i][x][x]的For循环,
axis=1
是循环a[x][i][x],
axis=2
是循环a[x][x][i]。4D,5D。。。应该有同样的方法

def my_reduce_max(a, axis=0):
    b = [[-1 for _ in range(3)] for _ in range(3)]
    for j in range(3):
        for k in range(3):
            tmp_max = -1
            for i in range(3):
                if axis == 0:
                    get_value = a[i][j][k]
                elif axis == 1:
                    get_value = a[j][i][k]
                else:
                    get_value = a[j][k][i]
                tmp_max = max(get_value, tmp_max)
            b[j][k] = tmp_max

    return b

a = np.arange(27).reshape((3,3,3))
print(a)
my_reduce_max(a, 2)

如果有人需要一个清晰的想法,以下是图片:


记住这一点的聪明方法是 axis=0折叠行 同时 轴=1将折叠柱

当使用sum函数和axis=0操作一个3*4数组时,将产生1*4输出,即所有行都将折叠,聚合将按列进行

使用axis=1执行相同的函数时,将折叠列并产生3*1输出,并沿行进行聚合

图像链接将进一步帮助吸收这一概念。

当然,这只是一个非常幼稚的代码,可以让您仔细思考这个想法。优化的实现应该减少这些for循环的数量。