昊虹AI笔记网

 找回密码
 立即注册
搜索
查看: 969|回复: 0
收起左侧

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

[复制链接]

239

主题

241

帖子

928

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
928
昊虹君 发表于 2022-11-8 21:52 | 显示全部楼层 |阅读模式
Python中使用元组或列表对ndarray的某个维度进行非连续选取和调序

大家都知道,numpy库中的ndarray可以用所谓的三帽号规则进行切片操作(详情可见我之前写的博文,链接 https://www.hhai.cc/thread-117-1-1.html)。

但是当对某个维度作非连续选择时怎么操作呢?比如在二维数组中,我想在行维度上只选择第2行和第4行怎么办?这个时候可以用Python中的元组或列表进行选择操作。关于元组或列表的概念,这里就不介绍了,这是Python中最基础的知识,不清楚的自行百度吧,随便一搜就能知道了

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

二维数组A中,我只想取A的第2行和第4行赋给B,该怎么操作呢?
代码如下:
  1. import numpy as np

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

  7. B = A[(2, 4), :]
复制代码

除了使用元组,也可使用列表,即语句“B = A[(2, 4), :] ”可写成“B = A[[2, 4], :] ”
运行结果如下:

可见,代码实现了把A的第2行和第4行选取了出来赋给了B(经实测,此时为深拷贝)。

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

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

  7. C = A[(4, 1, 2, 3, 0), :]
复制代码

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


同样可在二维矩阵的列维度上进行选取和调序操作,比如只选取第1列和第3列就可以写下面的代码:
  1. A = np.array([[1, 2, 3, 4, 5],
  2.               [6, 7, 8, 9, 10],
  3.               [11, 12, 13, 14, 15],
  4.               [16, 17, 18, 19, 20],
  5.               [21, 22, 23, 24, 25]], dtype='int')

  6. B = A[:, (1, 3)]
复制代码


同样,如果想把第0列和第4列进行调换就可以写下面的代码:
  1. A = np.array([[1, 2, 3, 4, 5],
  2.               [6, 7, 8, 9, 10],
  3.               [11, 12, 13, 14, 15],
  4.               [16, 17, 18, 19, 20],
  5.               [21, 22, 23, 24, 25]], dtype='int')

  6. C = A[:, (4, 1, 2, 3, 0)]
复制代码

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


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

要特别注意的是:
以二维矩阵为例,如果两个维度都用了元组或列表,那么要求这两个元组或列表的元素个数相同,并且结果是两个元组或列表组成的坐标对应的元素值,与想像中的选取某几行的某几列是有出入的。
上面这段描述有点难以理解,我举例说明吧。

如果两个维度都用了元组或列表,那么要求这两个元组或列表的元素个数相同,如果不相同,会报错,如下面这个例子:
  1. import numpy as np

  2. A = np.arange(10).reshape(2, 5)

  3. C = A[[0, 1], [0, 2, 4]]
复制代码

运行时会报错:


正确的使用示例如下:
  1. import numpy as np

  2. A = np.arange(10).reshape(2, 5)

  3. C = A[[0, 1], [2, 4]]
复制代码

运行结果如下:


由上面的运行结果可知,此时C的数据并不是我们想当然的

而是(2 9),事实上这是一种所谓的“mesh”用法。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|昊虹AI笔记网 ( 蜀ICP备2022024117号-1 )

GMT+8, 2024-5-6 23:28 , Processed in 0.027790 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表