python 3维矩阵转为2维
背景
有一个3维图像(多波段遥感影像),想要降维到2维,但要求按z轴方向把图像的每个像素值逐个取出,组成新的2维数组,忽略长宽维度。
实现
首先想到的是用numpy.reshape()来实现,看到很多帖子也是写了reshape简单的用法,例如
B = np.reshape(A,(-1,2))
但是,直接reshape会默认按第3维度取值,按行填充,不能满足我的需求。这里reshape有一个‘order’参数,可以参考 知乎-陈京九的文章 理解。
因为我想按z轴(第一维度)取波段值,所以思路也很简单,只要把3维矩阵的维度先调换一下,再用reshape就可以了。
而维度转换可以很方便的用numpy.transpose()
实现
a = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[0,1,2]]])
>>> print(a)
[[[1 2 3]
[4 5 6]]
[[7 8 9]
[0 1 2]]]
· 此时a是一个3维数组,维度是(2, 2, 3),按图像角度来看就是2波段*2行*3列
b = a.transpose((1,2,0))
>>> print(b)
[[[1 7]
[2 8]
[3 9]]
[[4 0]
[5 1]
[6 2]]]
>>> print(b.shape)
(2, 3, 2)
· transpose后,矩阵维度变为(2, 3, 2)
c = b.reshape((-1,2))
>>> print(c)
[[1 7]
[2 8]
[3 9]
[4 0]
[5 1]
[6 2]]
>>> print(c.shape)
(6, 2)
· reshape实现最终想要的结果