欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

使用 C 扩展的 NumPy 广播机制--3 阵列转置(轴切换)

最编程 2024-04-15 09:00:02
...
x = np.arange(9).reshape(33)
y = np.transpose(x) # 或者 y = x.transpose() 或者 x.T
y = np.transpose(x, [10])
x = np.array([3,2,1,0,4,5,6,7,8,9,10,11,12,13,14,15]).reshape(224)
y1 = np.transpose(x, [102])

请对照下图理解这个三维数组在内存中的样子以及对它的不同视图(view)。关于这点,文末附上的进阶篇有详细解读。

〄 注意,轴可以换,但数据是不动的。
y2 = np.transpose(x, [201])
# 代码放一起
x = np.array([3,2,1,0,4,5,6,7,8,9,10,11,12,13,14,15]).reshape(224)
y0 = np.transpose(x, [120])
y1 = np.transpose(x, [102])
y2 = np.transpose(x, [201])

看看变轴后各个数组的元素具体是怎样的,注意,它们都指向同一份数据。

这是怎么实现对内存中同一份数据使用不同的轴序呢?实际上,数据还是那些数据,更改的是各个轴上的步长 stride。

x.strides, y1.strides, y2.strides
# 数据还是同一份
id(x.data), id(y1.data), id(y2.data)

再看一个例子,三维数组有三个轴,注意换轴后每个轴的步长。

x = np.arange(16).reshape(224)
y = x.transpose((102))

两个数组三个轴对应的步长不同了。

轴更换后,下标也跟着换了,所以换轴前后相同下标指向的数据是不同的。

〄 轴换了,下标也跟着换了。
其实,轴的意义主要体现在步长上,所以换轴一定意义上就是更换了步长。
实际例子

RGB 图像数据

  • 每张图像由红绿蓝三个通道组成,每个通道对应一个 32×32 的二维数组
〄 一张 32x32 像素的图像。

看下图,从左到右,分别对应图像数据在内存中的存放,将一维数组转化为三维数组,更换轴。

那么,为什么要换轴呢?因为不同程序包对数据的要求不同,我们为了使用它们,需要按照它们对参数的要求来对数据作相应调整。

而有时候,并不需要换轴,只需要更换某个轴上元素的次序即可,例如,

# 变换某个轴上元素的次序
z = x[..., (3210)]