我对于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)是A
(轴1)是B
(轴2)是C
这是对的吗?
答案 0 :(得分:5)
你所说的一切都是正确的,但
除外为具有多个维度的数组定义轴。
也为一维数组定义了轴 - 只有一个(即轴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)
。
答案 1 :(得分:1)
记住这一点的聪明方法是 轴= 0折叠行 同时 axis = 1折叠列
当三个3 * 4数组用于求和函数且轴= 0时,将产生1 * 4的输出,因为所有行都将折叠,并且汇总将按列进行。
在axis = 1时执行的相同功能将折叠列并产生3 * 1输出,并沿行聚合。
图像链接将进一步帮助吸收这个概念。 inter-thread happens before
答案 2 :(得分:0)
虽然可以用3D来想象这一点,但我个人觉得很难想象当我们去4D或5D ......所以我决定放弃,而是从实施角度思考这个问题。基本上,它有N个嵌套的for
循环,如果我们想减少一个特定的轴,我们只需要处理该轴的for循环。例如,如果给定3x3x3张量,axis = 0
是[ i ] [x] [x]的for循环,axis = 1
将循环a [x] [ 我] [x],axis = 2
是循环[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)
答案 3 :(得分:0)