使用 C 扩展的 NumPy 广播机制--3 阵列转置(轴切换)
最编程
2024-04-15 09:00:02
...
x = np.arange(9).reshape(3, 3)
y = np.transpose(x) # 或者 y = x.transpose() 或者 x.T
y = np.transpose(x, [1, 0])
x = np.array([3,2,1,0,4,5,6,7,8,9,10,11,12,13,14,15]).reshape(2, 2, 4)
y1 = np.transpose(x, [1, 0, 2])
请对照下图理解这个三维数组在内存中的样子以及对它的不同视图(view)。关于这点,文末附上的进阶篇有详细解读。
y2 = np.transpose(x, [2, 0, 1])
# 代码放一起
x = np.array([3,2,1,0,4,5,6,7,8,9,10,11,12,13,14,15]).reshape(2, 2, 4)
y0 = np.transpose(x, [1, 2, 0])
y1 = np.transpose(x, [1, 0, 2])
y2 = np.transpose(x, [2, 0, 1])
看看变轴后各个数组的元素具体是怎样的,注意,它们都指向同一份数据。
这是怎么实现对内存中同一份数据使用不同的轴序呢?实际上,数据还是那些数据,更改的是各个轴上的步长 stride。
x.strides, y1.strides, y2.strides
# 数据还是同一份
id(x.data), id(y1.data), id(y2.data)
再看一个例子,三维数组有三个轴,注意换轴后每个轴的步长。
x = np.arange(16).reshape(2, 2, 4)
y = x.transpose((1, 0, 2))
两个数组三个轴对应的步长不同了。
轴更换后,下标也跟着换了,所以换轴前后相同下标指向的数据是不同的。
其实,轴的意义主要体现在步长上,所以换轴一定意义上就是更换了步长。
实际例子
RGB 图像数据
-
每张图像由红绿蓝三个通道组成,每个通道对应一个 32×32
的二维数组
看下图,从左到右,分别对应图像数据在内存中的存放,将一维数组转化为三维数组,更换轴。
那么,为什么要换轴呢?因为不同程序包对数据的要求不同,我们为了使用它们,需要按照它们对参数的要求来对数据作相应调整。
而有时候,并不需要换轴,只需要更换某个轴上元素的次序即可,例如,
# 变换某个轴上元素的次序
z = x[..., (3, 2, 1, 0)]
上一篇: (注释)C 语言 - 复习
下一篇: C 代码注释 - C 语言零基础教程