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.hqwc.cn/news/340797.html

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

相关文章

并发前置知识一:线程基础

一、通用的线程生命周期&#xff1a;“五态模型” 二、java线程有哪几种状态&#xff1f; New&#xff1a;创建完线程Runable&#xff1a;start(),这里的Runnable包含操作的系统的Running&#xff08;运行状态&#xff09;和Ready&#xff08;上面的可运行状态&#xff09;Blo…

快速打通 Vue 3(四):标签的 ref 属性与 Vue3 生命周期

很激动进入了 Vue 3 的学习&#xff0c;作为一个已经上线了三年多的框架&#xff0c;很多项目都开始使用 Vue 3 来编写了 这一组文章主要聚焦于 Vue 3 的新技术和新特性 如果想要学习基础的 Vue 语法可以看我专栏中的其他博客 Vue&#xff08;一&#xff09;&#xff1a;Vue 入…

小程序基础学习(组件化)

&#xff08;一&#xff09;创建 找到components文件夹下面创建新的文件夹 然后再文件夹内创建component格式的文件 创建后这样 我创建的是my-info的文件夹以及my-info的components文件&#xff0c;跟着普通的页面一样 &#xff08;二&#xff09; 注册组件 找到你需要使用组…

openGauss学习笔记-194 openGauss 数据库运维-常见故障定位案例-分析查询语句长时间运行的问题

文章目录 openGauss学习笔记-194 openGauss 数据库运维-常见故障定位案例-分析查询语句长时间运行的问题194.1 分析查询语句长时间运行的问题194.1.1 问题现象194.1.2 原因分析194.1.3 处理办法 openGauss学习笔记-194 openGauss 数据库运维-常见故障定位案例-分析查询语句长时…

如何在Docker本地搭建流程图绘制神器draw.io并实现公网远程访问

推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 前言 提到流程图&#xff0c;大家第一时间可能会想到Visio&#xff0c;不可否认&#xff0c;VIsio确实是功能强大&#xff0c;但是软…

你了解计算机网络的发展历史吗?

1.什么是计算机网络 计算机网络是指将一群具有独立功能的计算机通过通信设备以及传输媒体被互联起来的&#xff0c;在通信软件的支持下&#xff0c;实现计算机间资源共享、信息交换或协同工作的系统。计算机网络是计算机技术与通信技术紧密结合的产物&#xff0c;两者的迅速发展…

linux手动安装 vscode-server

适用场景 很多时候&#xff0c;我们需要在本机&#xff08;比如windows&#xff09;通过remote ssh访问远程服务器&#xff08;一般是ubuntu&#xff09;&#xff0c;但经常出现 vscode 一直连不上远程服务器的情况&#xff0c;看一下 log&#xff1a; 这个log表示远程服务器…

2023年低代码无代码产业大会:核心内容与学习收获(附大会核心PPT下载)

2023年低代码无代码产业大会聚焦了行业最前沿的趋势与技术&#xff0c;为企业数字化转型提供新的思路和方法。在这次大会上&#xff0c;我们可以深入了解到低代码/无代码技术的最新发展&#xff0c;以及如何利用这些技术来提高业务效率和创新能力。 一、大会的核心内容 1、低代…

在加载第三方库过程中,无法加载到库的问题(使用readelf, patchelf命令)

无法加载到库问题 问题及分析过程readelf 命令patchelf命令 问题及分析过程 在开发一个程序过程中&#xff0c;需要加载第三方库iTapTradeAPI, 在CMakeList.txt中已经设置了CMAKE_INSTALL_RPATH&#xff0c;但是发布到生产之后由于目录问题无法加载到libiTapTradeAPI库了 下面…

统计学-R语言-2.2

文章目录 前言导入.RData文件方式1方式2方式3 导入程序包总结 前言 本篇文章是将上篇得软件安装完&#xff0c;对其部分功能进行介绍。 导入.RData文件 在我们日常练习时会有.RData文件导入&#xff0c;并对其进行分析&#xff0c;下面是两种方导入.RData文件。 方式1 直接…

iOS rootless无根越狱解决方案

据游戏工委数据统计&#xff0c;2023年国内游戏市场实际销售收入与用户规模双双创下新高&#xff0c;游戏普遍采用多端并发方式&#xff0c;成为收入增长的主因之一。 中国市场实际销售收入及增长率丨数据来源&#xff1a;游戏工委 多端互通既是机遇&#xff0c;也是挑战。从游…

跟着仙凡兄学习编译Telegram vs2022 2024.1.11编译成功

编译Telegram 本人花了两天&#xff0c;问官方作者终于编译成功Telegram 运行环境&#xff1a;win11 vs2022 参见学习视频&#xff1a;【telegram编译成功&#xff0c;编译遇到的各种问题】https://www.bilibili.com/video/BV11c411x7jm?vd_sourcedf2e51268cc7412cc3937cf3df2…