政安晨:【示例演绎】【Python】【Numpy数据处理】快速入门(二)

环境准备

大家如果第一次看到,可以先从我这个演绎系列的第一篇文章开始,包括准备环境等等。

第一篇文章如下:

政安晨:【示例演绎】【Python】【Numpy数据处理】快速入门(一)icon-default.png?t=N7T8https://blog.csdn.net/snowdenkeke/article/details/136125773

继续

小伙伴们准备好环境后,咱们继续。

因为Numpy的数据处理,针对的很大一部分是数组,所以咱们还是从数组继续。

大家打开已经准备好的Jupyter:

创建数组

通常情况下,科学数据都是海量的、层次关系复杂的。

咱们创建数组在很多情况下是用来做原型验证和算法验证的,当然,NumPy为创建数组提供了非常丰富的手段,配合数据类型设置、结构设置,可以创建出任何形式的数组。

咱们可以将创建数组的方法分成:创建简单数组创建复杂数组两大类。

其实简单数组和复杂数组并没有严格的分界线,大致上,凭空创建出来的数组称为简单数组,如蛮力构造法、特殊数值法、随机数值法和定长分割法等;

通过数据延伸创建出来的数组称为复杂数组,如重复构造法、网格构造法等。

现在让咱们一点点地演绎尝试。

蛮力构造法

蛮力构造法使用np.array( )函数来创建数组,原型为:

np.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)

固定参数(必要参数)只有一个object,示例(我用的是列表,也可以改为元组):

# 创建2行3列数组
a = np.array([[1,2,3],[4,5,6]])
a

在np.array( )函数的默认参数中,dtype参数用于指定数据类型。

创建数组时,如果不指定数据类型,np.array( )函数会根据object参数自动选择合适的数据类型。当然,也可以如下代码中演示的这样,在创建数组时,指定元素的数据类型:

# 创建8位无符号整型数组
a = np.array([[1,2,3],[4,5,6]], dtype=np.uint8)
a

蛮力构造法就是将想要创建数组的数据结构直接用Python列表或元组写出来,再用np.array( )函数转为数组。这个方法虽然看起来简单,但很容易出错,不适合创建体量较大的数组。

特殊数值法

这里的特殊数值指的是0、1、空值,特殊数值法适合构造全0、全1、空数组,或由0、1组成的类似单位矩阵(主对角线为1,其余为0)的数组

特殊数值法使用的4个函数原型如下:

np.zeros(shape, dtype=float, order='C')
np.ones(shape, dtype=float, order='C')
np.empty(shape, dtype=float, order='C')
np.eye(N, M=None, k=0, dtype=float, order='C')

固定参数shape表示生成的数组结构,默认参数dtype用于指定数据类型(默认浮点型)。

虽然order参数几乎用不到,但作为常识,我们有必要了解一下:order参数指定的是数组在内存中的存储顺序,“C”表示C语言使用的行优先方式,“F”表示Fortran语言使用的列优先方式。

使用上面4个函数配合shape和dtype参数,可以很方便地创建出一些简单数组,其代码如下:

np.zeros(6)

np.zeros((2,3))

np.ones((2,3),dtype=np.int32)

np.empty((2,3))

np.eye(3, dtype=np.uint8)

咱们演绎一下试试:

A

B

C

D

E

如果需要一个3行4列、初始值都是255的无符号整型数组,应该怎么做呢?

全1数组乘以255,或全0数组加255,都是很好的解决方案,另外,使用填充函数fill( )也可以解决这个问题。fill( )函数不只可以填充空数组,任何数组都可以使用它来填充固定的值,其代码如下:

a = np.empty((3,4), dtype=np.uint8)
a.fill(255)
a

随机数值法

和Python的标准模块random类似,NumPy有一个random子模块,其功能更加强大,用随机数值法创建数组主要就是使用random子模块,random子模块的方法很多,咱们这里介绍3个最常用的函数:

np.random.random(size=None)
np.random.randint(low, high=None, size=None)
np.random.normal(loc=0.0, scale=1.0, size=None)

random( )函数用于生成 [0,1) 区间内的随机浮点型数组,randint( )函数用于生成[low, high)区间内的随机整型数组,参数size是一个元组,用于指定生成数组的结构。

代码如下(这里描述的[0,1)区间和[low, high)区间都是左闭右开的):

np.random.random(3)

np.random.random((2,3))

np.random.randint(5)

np.random.randint(1, 5, size=(2,3))

咱们一个个地来演绎尝试:

A

B

C

D

上述演绎大家自己体会

normal( )函数用于生成以loc为均值、以scale为标准差的正态分布数组。
下面用正态分布函数模拟生成1000位成年男性的身高数据(假定成年男性平均身高为170厘米,标准差为4厘米),并画出下面的柱状图。

代码如下:

# 导入绘图模块
import matplotlib.pyplot as plt

# 生成正态分布数据
tall = np.random.normal(170, 4, 1000) 

# 从156厘米到190厘米,每2厘米一个分段
bins = np.arange(156, 190, 2) 

# 绘制柱状图
plt.hist(tall, bins)

# 显示图形
plt.show() 

定长分割法

定长分割法最常用的函数是arange( ),它看起来和Python的range( )函数很像,只是前面多了一个字母a,另一个常用的定长分割函数是linspace( ),类似于arange( )函数,但功能更加强大,两个函数的原型如下:

np.arange(start, stop, step, dtype=None)
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

arange( )函数和Python的range( )函数用法相同,并且还可以接收浮点型参数,代码如下:

np.arange(5)

np.arange(5, 11)

np.arange(5,11,2)

np.arange(5.5, 11, 1.5)

np.arange(3,15).reshape(3,4)

A

B

C

D

E

linspace( )函数需要3个参数:一个起点、一个终点、一个返回元素的个数,linspace( )函数返回的元素包括起点和终点,我们可以通过endpoint参数选择是否包含终点,代码如下

# 返回0到5之间的5个等距数值,包括0和5
np.linspace(0, 5, 5)

# 返回5个等距数值,包括0但不包括5
np.linspace(0, 5, 5, endpoint=False) 

重复构造法

重复构造法,顾名思义就是根据特定的规则对已有数组不断重复,从而生成新的数组。

重复构造法主要使用repeat( )和tile( )这两个函数,repeat( )函数用来重复数组元素。

但如果被重复的数组是一个多维数组,且repeat( )函数指定了axis参数,情况就会变得有些复杂,代码如下

a = np.arange(5)
a

# 重复一维数组元素3次
np.repeat(a, 3) 

a = np.arange(6).reshape((2,3))
a

# 重复二维数组元素3次,不指定轴
np.repeat(a, 3) 

# 重复二维数组元素3次,指定0轴
np.repeat(a, 3, axis=0) 

# 重复二维数组元素3次,指定1轴
np.repeat(a, 3, axis=1)

演绎如下:

A

B (将一维数组中的元素重复3次)

C

D (不指定轴)

E (重复二维数组元素3次,指定0轴)

F (重复二维数组元素3次,指定1轴)

tile的原意是铺地砖或贴墙砖,总之是把一块一块的地砖或墙砖,一排排一列列地排列整齐,tile( )函数也是如此,它将整个数组而非数组元素水平和垂直重复指定的次数。

因为没有axis参数,所以tile( )函数相对容易理解,代码如下:

a = np.arange(5)
a

# 重复一维数组3次
np.tile(a, 3) 
# 重复一维数组3行2列
np.tile(a, (3,2)) 

a = np.arange(6).reshape((2,3))
a

# 重复二维数组3次
np.tile(a, 3)
# 重复二维数组2行3列
np.tile(a, (2,3))

B

网格构造法

众所周知,研究地球表面需要经纬度坐标,经度从西经180°(-180°)到东经180°(180°),纬度从北纬90°(90°)到南纬90°(-90°),把经纬度线画出来,就形成了一个经纬度网格。

经纬度网格是科学数据中常用的概念。

通常,经度用longitude表示,简写为lon,纬度用latitude表示,简写为lat。那么,如何用数组表示经纬度网格呢?

用数组表示经纬度网格一般有两种方式:

第一种方式,用两个一维数组表示。

下面的代码使用定长分割函数linspace( ),将经度从-180°到180°分为间隔为10°的37个点,将纬度从90°到-90°分为间隔为10°的19个点,得到两个一维数组。

# 精度为10°,共计37个经度点
lon = np.linspace(-180,180,37) 

# 精度为10°,共计19个纬度点
lat = np.linspace(90,-90,19) 

第二种方式,是用两个二维数组分别表示经度网格和纬度网格。

经度网格中每一列的元素都是相同的(同一个经度),纬度网格中每一行的元素都是相同的(同一个纬度),生成二维经纬度网格的常用函数是np.meshgrid( ),该函数以一维经度数组lon和一维纬度数组lat为参数,返回二维的经度数组和纬度数组,代码如下:

lons,lats = np.meshgrid(lon,lat)
lons.shape
lats.shape
lons[:,0]
lats[0]

演绎如下:

其实,从上面的代码中可以看出,二维经度数组lons的第0列所有元素都是-180°,二维纬度数组lats的第0行所有元素都是90°。

构造经纬度网格,除了使用np.meshgrid( )函数外,还有一个更强大的方法,这个方法可以直接生成纬度网格和经度网格而无须借助于一维数组(纬度在前,经度在后),代码如下:

# 用实数指定网格精度为5°
lats, lons = np.mgrid[90:-91:-5, -180:181:5] 
lons.shape, lats.shape

# 也可以用虚数指定分割点数
lats, lons = np.mgrid[90:-90:37j, -180:180:73j] 
lons.shape, lats.shape

上面的例子中用到了虚数,构造复数的方法如下:

r, i = 2, 5
complex(r, i)

自定义数据类型

NumPy也支持字符串类型和自定义类型,但绝大多数函数和方法不适用于非数值型数组,因此,自定义数据类型将是最后的选择

同一个列表中,元素类型既有字符串,又有整型和浮点型,将该列表转成数组,会报错吗?如果不报错,数组的数据类型是什么呢?咱们演绎一下,代码如下:

np.array(['Anne', 1.70, 55])

结果显示,数组会将所有元素的数据类型都转为'<U4'类型。

这里的U表示Unicode字符串;<表示字节顺序,意为小端在前(低位字节存储在最小地址中);4表示数组元素占用4字节,数组元素占用的字节数由所有元素中最长的那个元素决定。

怎样在数组中保留用以生成数组的列表中的元素类型呢?这就需要用到自定义数据类型了。

自定义数据类型类似于C语言的结构体,其代码如下:

mytype = np.dtype([('name','S32'), ('tall',np.float64), ('bw',np.int32)])
np.array([('Anne', 1.70, 55)], dtype=mytype)

告一段落

咱们的这篇文章先到这里,演绎了Numpy创建数组的多种方法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么搭建自己的网站?

怎么搭建自己的网站 一.领取一个免费域名和SSL证书&#xff0c;和CDN 特点&#xff1a;支持Cloudflare CDN Cloudflare是全球知名的CDN提供商&#xff0c;如果你不想暴露你的源站&#xff0c;又想使用我们的二级域名&#xff0c;不需要前往Cloudflare添加域名&#xff0c;修…

【Linux取经路】文件系统之被打开的文件——文件描述符的引入

文章目录 一、明确基本共识二、C语言文件接口回顾2.1 文件的打开操作2.2 文件的读取写入操作2.3 三个标准输入输出流 三、文件有关的系统调用3.1 open3.1.1 比特位级别的标志位传递方式 3.2 write3.2.1 模拟实现 w 选项3.2.2 模拟实现 a 选项 3.3 read 四、访问文件的本质4.1 再…

STM32,嵌入式系统中的I2C协议

I2C协议——读写EEPROM 关注我&#xff0c;共同交流&#xff0c;一起成长 前言一、协议简介二、I2C特性及架构三、通信过程 前言 这是一种主要用于集成电路和集成电路&#xff08;IC&#xff09;通信&#xff0c;计算机中复杂的问题大多数就是用分层来进行解决&#xff0c;这个…

k8s-项目部署案例

一、容器交付流程 在k8s平台部署项目流程 在K8s部署Java网站项目 DockerFile 如果是http访问&#xff0c;需要在镜像仓库配置可信任IP 三、使用工作负载控制器部署镜像 建议至少配置两个标签 一个是声明项目类型的 一个是项目名称的 继续配置属性 资源配额 健康检查 五、使…

积分(二)——复化Simpson(C++)

前言 前言 simpson积分 simpson积分公式 ∫ a b f ( x ) d x ≈ b − a 6 [ f ( a ) f ( b ) 4 f ( a b 2 ) ] \int_{a}^{b}f(x)dx \approx \frac{b-a}{6}[f(a)f(b)4f(\frac{ab}{2})] ∫ab​f(x)dx≈6b−a​[f(a)f(b)4f(2ab​)] 与梯形积分类似&#xff0c;当区间[a,b]较…

Java 和 JavaScript 的奇妙协同:语法结构的对比与探索(下)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

卷积神经网络的基本结构

卷积神经网络的基本结构 与传统的全连接神经网络一样&#xff0c;卷积神经网络依然是一个层级网络&#xff0c;只不过层的功能和形式发生了变化。 典型的CNN结构包括&#xff1a; 数据输入层&#xff08;Input Layer&#xff09;卷积层&#xff08;Convolutional Layer&#x…

社区商铺开什么店最好?从商业计划书到实际运营

在社区商铺开店&#xff0c;选择适合的业态是成功的关键。作为一名开店 5 年的资深创业者&#xff0c;我想分享一些关于社区店的干货和见解。 这篇文章&#xff0c;我用我的项目给大家举例子&#xff01; 鲜奶吧作为一种新兴的业态&#xff0c;以提供新鲜、健康的乳制品为主&…

vue3 之 倒计时函数封装

理解需求 编写一个函数useCountDown可以把秒数格式化为倒计时的显示xx分钟xx秒 1️⃣formatTime为显示的倒计时时间 2️⃣start是倒计时启动函数&#xff0c;调用时可以设置初始值并且开始倒计时 实现思路分析 安装插件 dayjs npm i dayjs倒计时逻辑函数封装 // 封装倒计时…

C++类和对象-多态->多态的基本语法、多态的原理剖析、纯虚函数和抽象类、虚析构和纯虚析构

#include<iostream> using namespace std; //多态 //动物类 class Animal { public: //Speak函数就是虚函数 //函数前面加上virtual关键字&#xff0c;变成虚函数&#xff0c;那么编译器在编译的时候就不能确定函数调用了。 virtual void speak() { …

流量主小程序/公众号h5开源代码 源码分享

小程序开源代码合集 1、网课搜题小程序源码/小猿题库多接口微信小程序源码自带流量主 搭建教程 1、微信公众平台注册自己的小程序 2、下载微信开发者工具和小程序的源码 3、上传代码到自己的小程序 界面截图&#xff1a; 开源项目地址&#xff1a;https://ms3.ishenglu.com…

python 人脸检测器

import cv2# 加载人脸检测器 关键文件 haarcascade_frontalface_default.xml face_cascade cv2.CascadeClassifier(haarcascade_frontalface_default.xml)# 读取图像 分析图片 ren4.png image cv2.imread(ren4.png) gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 进行人脸…

php基础学习之函数

基本概念 是一种语法结构&#xff0c;将实现某一个功能的代码块封装到一个结构中&#xff0c;从而实现代码的重复利用 php函数的定义语法 &#xff08;与C/Java很类似&#xff0c;区别在于没有数据类型&#xff0c;因为php是弱类型语言&#xff09; function 函数名(参数){ //…

波奇学Linux:文件系统打开文件

从文件系统来看打开文件 计算机系统和磁盘交互的大小是4kb 物理内存的4kb&#xff0c;磁盘的4kb文件叫做页帧 磁盘数据块的以4kb为单位。 减少IO的次数&#xff0c;减少访问外设的次数--硬件 基于局部性的原理&#xff0c;预加载机制--软件 操作系统管理内存 操作系统对…

leetcode hot 100最小花费爬楼梯

本题和之前的爬楼梯类似&#xff0c;但是需要考虑到花费的问题&#xff01;**注意&#xff0c;只有在爬的时候&#xff0c;才花费体力&#xff01;**那么&#xff0c;我们还是按照动态规划的五部曲来思考。 首先我们要确定dp数组的含义&#xff0c;那么就是我们爬到第i层所花费…

[嵌入式AI从0开始到入土]14_orangepi_aipro小修补含yolov7多线程案例

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注&#xff1a;等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间&#xff0c;后期会考虑出视频教程&#xff0c;务必催更&#xff0c;以防我变身鸽王。 第1期 昇腾Altas 200 DK上手 第2期 下载昇腾案例并运行 第3期 官…

DDR简单了解

DDR全称为 double data rate Synchronous Dynamic Random Access Memory 既DDR SDRAM。 顾名思义需要依次了解这些名词DRAM, SDRAM, DDR, DDR2, DDR3, DDR4。因为这些名词代表DRAM发展的不同阶段&#xff0c;它们是内存的同一条技术路线&#xff0c;核心都是使用一个晶体管和一…

debug - 打补丁 - 浮点数加法

文章目录 debug - 打补丁 - 浮点数加法概述笔记demo用CE查看汇编(x64debug)main()update_info()快捷键 - CE中查看代码时的导航打补丁的时机 - 浮点数加法补丁代码补丁效果浮点数寄存器组的保存END debug - 打补丁 - 浮点数加法 概述 在cm中, UI上显示的数值仅仅用来显示, 改…

开启AI新篇章:全新GPT-4订阅方案! ChatGPTPlus(GPT4)支付渠道! 付费充值!

1. GPT-4订阅价格 以每月仅20美元的价格&#xff0c;引领您进入GPT-4的强大数字体验世界。作为前沿的语言模型&#xff0c;GPT-4为您的工作和创造带来了无与伦比的生产力提升&#xff0c;彻底改变您的工作和创造方式。 GPT-4不仅具有卓越的自然语言处理能力&#xff0c;还引入…

kafka如何保证消息不丢?

概述 我们知道Kafka架构如下&#xff0c;主要由 Producer、Broker、Consumer 三部分组成。一条消息从生产到消费完成这个过程&#xff0c;可以划分三个阶段&#xff0c;生产阶段、存储阶段、消费阶段。 产阶段: 在这个阶段&#xff0c;从消息在 Producer 创建出来&#xff0c;…