Python中使用元组对ndarray矩阵的某个维度进行选取和调序的操作

Posted 昊虹图像算法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python中使用元组对ndarray矩阵的某个维度进行选取和调序的操作相关的知识,希望对你有一定的参考价值。

大家应该都知道,numpy库中的ndarray可以用所谓的三帽号规则进行切片操作(详情可见我之前写的博文,链接 https://blog.csdn.net/wenhao_ir/article/details/123034635 ),但是当对某个维度作离散选择时怎么操作呢?比如在二维数组中,我想在行维度上只选择第3行和第4行怎么办?这个时候可以用Python中的元组进行选择操作。所谓Python中的元组简单理解就是以小括号括起来的序列…什么?什么叫序列?好吧,我懒得打字,直接上截图吧!

关于列表的相关概念见下面的截图:

关于元组的介绍见下面的截图:

说那么多不如举两个例子…
比如在二维数组A中,我只想取A的第3行和第4行赋给B,该怎么操作呢?代码如下:

import numpy as np

A = np.array([[1, 2, 3, 4, 5],
              [6, 7, 8, 9, 10],
              [11, 12, 13, 14, 15],
              [16, 17, 18, 19, 20],
              [21, 22, 23, 24, 25]], dtype='int')

B = A[(2, 4), :]

设断点,A和B里的数据情况如下:

可见,实现了把A的第2行和第4行选取了出来赋给了B。

有时候,我们还想把A在行的维度上进行调换,比如我把第0行第4行进行调换,怎么操作呢?可以像下面这样操作。

import numpy as np

A = np.array([[1, 2, 3, 4, 5],
              [6, 7, 8, 9, 10],
              [11, 12, 13, 14, 15],
              [16, 17, 18, 19, 20],
              [21, 22, 23, 24, 25]], dtype='int')

C = A[(4, 1, 2, 3, 0), :]

运行结果如下,可见实现了调换:

同样可在二维矩阵的列维度上进行选取和调序操作,比如只选取第1列和第3列就可以写下面的代码:

A = np.array([[1, 2, 3, 4, 5],
              [6, 7, 8, 9, 10],
              [11, 12, 13, 14, 15],
              [16, 17, 18, 19, 20],
              [21, 22, 23, 24, 25]], dtype='int')

B = A[:, (1, 3)]

而想把第0列和第4列进行调换就可以写下面的代码:

A = np.array([[1, 2, 3, 4, 5],
              [6, 7, 8, 9, 10],
              [11, 12, 13, 14, 15],
              [16, 17, 18, 19, 20],
              [21, 22, 23, 24, 25]], dtype='int')

C = A[:, (4, 1, 2, 3, 0)]

当维度大于2时,同样的操作,做图像处理的同学都知道,彩色图像有三个通道,比如BGR图像,就有B通道、G通道和R通道,有时候我需要对这些通道做一个调换,怎么办呢?比如我要把BGR图像转化成RGB图像,下面这条语句就可以搞定了:

img2 = img[:, :, (2, 1, 0)]

这里要注意,各个逗号之前的参数的意义。想像一幅图像有n行m列,即有n×m个像素点,每个像素点由k个数字组成,那么第一个逗号前的参数表示对这n行的选取,第二个逗号之前表示对这m列的选取,第二个逗号之后表示对表示每个像素点的k个数字的选取。这一点非常重要,如果不理解这个就不知道为什么"(2,1,0)"是写在第二个逗号之后。

以上是关于Python中使用元组对ndarray矩阵的某个维度进行选取和调序的操作的主要内容,如果未能解决你的问题,请参考以下文章

NumPy_1

numpy快速入门

numpy快速入门

numpy使用

python之numpy的基本使用

numpy.where用法