IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> numpy高级索引(二维矩阵的索引是二维矩阵) -> 正文阅读

[Python知识库]numpy高级索引(二维矩阵的索引是二维矩阵)

1.问题描述

最近在看语义分割的源码,但是预测阶段有一行代码看的我头大,不知道在索引些什么东西。后来经过查阅资料和实验发现这是numpy的高级索引,故写这篇博文记录一下自己是如何理解的。这行代码长这样。意思是把前向传播得到的预测值取最大值,并把最大值的索引值赋值给pre_label((352,480)的矩阵)。这个索引值代表了一张图经过模型的预测后,每一个像素值分别属于哪一个类别。通过这张全图都是索引值的图,去cm(color map)中找属于这个索引值的相应颜色(每个索引值对应了RGB3个通道的颜色),其中最关键的一部分就是pre = cm[pre_label]这一行代码。

for i, sample in enumerate(test_data):
    valImg = sample['img'].to(device)
    valLabel = sample['label'].long().to(device)
    out = net(valImg)#  1*12*352*480
    out = F.log_softmax(out, dim=1)
    pre_label = out.max(1)[1].squeeze().cpu().data.numpy()  # 352*480的矩阵
    pre = cm[pre_label]  # cm是12*3的矩阵
    pre1 = Image.fromarray(pre)
    pre1.save(dir + str(i) + '.png')
    print('Done')

那么问题来了!(12,3)的矩阵的索引是一个(352,480)的矩阵,索引出来是个什么玩意?

2.查阅资料

资料:根据用户手册,numpy数组支持数组索引。返回的数组与索引数组具有相同的形状,与原数组元素具有相同的类型和值(被索引位置)。针对你的问题,也就是你理解的:返回的还是一个二维数组,返回数组的值是以二维数组每个元素作为一维数组索引在一维数组中的值。

资料看半天,也不像是人话。所以自己动手做实验。

3.实验

首先定义数组,label模拟上面的cm(color map),index模拟上面的pre_label((352,480)的矩阵),但是我这边设置这么大的矩阵不利于查看结果,所以我只设置了(4,5)的矩阵,方便后面查看结果。
在这里插入图片描述

先看一下经过这种特殊索引后的shape
在这里插入图片描述
从这个shape可以看出,由于label[index]索引的时候并没有逗号,所以是对第一个维度的数据进行操作。再结合第二部分的资料就很好理解了:返回的数组与索引数组具有相同的形状,与原数组元素具有相同的类型和值(被索引位置)。资料中是针对的索引是一维数组的情况下。那么拓展一下,把一维(数组)拓展到二维(矩阵)。那么这条也是成立的。即把label原本(12,3)的shape的第一个维度拿出来,也就是12。被(4,5)的矩阵索引后。12这个维度就变成了(4,5)。其他维度不变。所以shape是(4,5,3)。那么这个(4, 5,3)的矩阵里面究竟是什么呢?通过之前学到numpy高级索引很容易就得到结果了。就是将index里的每一个元素的值(我这里设置的是1)当做label第一个维度(也就是行)进行索引。所以组成的(4,5,3)这个矩阵里全部由label中第二行(0对应第一行,1对应是第二行)组成。
在这里插入图片描述

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-09-18 10:05:38  更:2021-09-18 10:06:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 14:23:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码