Python中使用元组或列表对ndarray的某个维度进行非连续选取和调序

Python中使用元组或列表对ndarray的某个维度进行非连续选取和调序

大家都知道,numpy库中的ndarray可以用所谓的三帽号规则进行切片操作(详情可见我之前写的博文,链接 https://www.hhai.cc/thread-117-1-1.html)。
但是当对某个维度作非连续选择时怎么操作呢?比如在二维数组中,我想在行维度上只选择第2行和第4行怎么办?这个时候可以用Python中的元组或列表进行选择操作。关于元组或列表的概念,这里就不介绍了,这是Python中最基础的知识,不清楚的自行百度吧,随便一搜就能知道了。

举两个例子说明如何在某个维度作非连续选择。

在二维数组A中,我只想取A的第2行和第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), :]  

除了使用元组,也可使用列表,即语句“B = A[(2, 4), :] ”可写成“B = A[[2, 4], :] ”
运行结果如下:
在这里插入图片描述
可见,代码实现了把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图像,那么下面这条语句就可以实现这个需求:

img_rgb = img_bgr[:, :, (2, 1, 0)]

为什么上面这句话能搞定,除了这篇博文讲的内容,你可能还需要阅读下面这篇文章
Python-OpenCV中的函数cv.imread()读取到的图像的数据存储结构是怎样的?

要特别注意的是:
以二维矩阵为例,如果两个维度都用了元组或列表,那么要求这两个元组或列表的元素个数相同,并且结果是两个元组或列表组成的坐标对应的元素值,与想像中的选取某几行的某几列是有出入的。
上面这段描述有点难以理解,大家看一个例子就明白了。
具体的例子请大家参见博文 https://www.hhai.cc/thread-119-1-1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值