你如何“描述”一个 4d 数组?我们没有直觉可以匹配;我们能做的最好的就是从 2d 经验中进行项目。行、列、平面、??
这个数组足够小,可以显示实际的打印:
In [271]: arr = np.arange(24).reshape(3,2,2,2)
In [272]: arr
Out[272]:
array([[[[ 0, 1],
[ 2, 3]],
[[ 4, 5],
[ 6, 7]]],
[[[ 8, 9],
[10, 11]],
[[12, 13],
[14, 15]]],
[[[16, 17],
[18, 19]],
[[20, 21],
[22, 23]]]])
打印用额外的 [] 和空白行标记更高的尺寸。
In [273]: arr.swapaxes(0,2)
Out[273]:
array([[[[ 0, 1],
[ 8, 9],
[16, 17]],
[[ 4, 5],
[12, 13],
[20, 21]]],
[[[ 2, 3],
[10, 11],
[18, 19]],
[[ 6, 7],
[14, 15],
[22, 23]]]])
要查看实际执行的操作,我们必须查看数组的底层属性
In [274]: arr.__array_interface__
Out[274]:
{'data': (188452024, False),
'descr': [('', '<i4')],
'shape': (3, 2, 2, 2),
'strides': None, # arr.strides = (32, 16, 8, 4)
'typestr': '<i4',
'version': 3}
In [275]: arr.swapaxes(0,2).__array_interface__
Out[275]:
{'data': (188452024, False),
'descr': [('', '<i4')],
'shape': (2, 2, 3, 2),
'strides': (8, 16, 32, 4),
'typestr': '<i4',
'version': 3}
data 属性是相同的 - 交换是一个视图,与原始共享数据缓冲区。所以没有数字移动。
形状变化很明显,我们告诉它交换。有时它有助于使所有维度都不同,例如(2,3,4)
它还交换了 2 个strides 值,尽管这对显示的影响很难解释。我们必须了解形状和步幅如何协同工作以创建多维数组(从平面数据缓冲区)。