Axes在更高程度的numpy数组中交换

时间:2017-08-09 15:59:06

标签: arrays numpy swap axes

所以我正在着手完成一项任务,弄清楚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个或更多轴时发生的抽象交换,那将是很棒的。谢谢!

1 个答案:

答案 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值,但这对显示的影响难以解释。我们必须知道形状和步长如何协同工作以创建多维数组(来自平面数据缓冲区)。