Python numpy轴编号的明确权威解释?
我对术语axis在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,
轴是为具有多个维度的阵列定义的。
二维数组有两个对应的轴:
第一个垂直向下跨行运行(轴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循环的数量。