大家应该都知道,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)"是写在第二个逗号之后。
|