所以我正在着手完成一项任务,弄清楚numpy swapaxes功能如何运作,并且当涉及到维度数组中的轴交换时遇到了一种障碍。 3。 说
import numpy as np
array=np.arange(24).reshape(3,2,2,2)
这会创建一个形状为numpy的数组(3,2,2,2),其元素为0-2。有人可以向我解释在这种情况下轴的交换是如何工作的,我们无法分别将四个轴可视化吗? 假设我想交换轴0和2.
array.swapaxes(0,2)
如果有人能够真正描述当有4个或更多轴时发生的抽象交换,那将是很棒的。谢谢!
答案 0 :(得分:0)
你怎么形容'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
值,但这对显示的影响难以解释。我们必须知道形状和步长如何协同工作以创建多维数组(来自平面数据缓冲区)。