Python中NumPy详解

文章目录

    • NumPy
      • NumPy介绍
      • 导入NumPy
      • NumPy数组
        • 序列生成数组
        • 函数生成数组
          • range,arange,linspace
        • 其他常用函数
      • N维数组的属性
      • NumPy数组的运算
        • 向量运算
        • 算数运算
        • 逐元素运算、点乘运算
      • 操作数组元素
        • 索引访问数组
        • 切片访问数组
        • 转置与展平
      • NumPy的广播
      • NumPy的高级索引
        • 整数索引
        • 布尔索引
      • 数组的堆叠
        • 水平方向堆叠
        • 竖直方向堆叠
        • 深度方向堆叠
        • 行堆叠和列堆叠
      • 数组的分割
      • 随机数

NumPy

NumPy介绍

在Python中有列表和数组模块,但是都不好用,列表的缺点是要保存每个对象的指针,如果你的列表有一百万个元素,他就有一百万个指针,而数组又只支持一维数组,并不适合数值运算

NumPy的模块支持数组和矩阵(向量)的运算,对机器学习算法比较友好,支持n维数组,有强大的数学运算对很多第三方库(SciPy,Pandas)都提供的底层支持

导入NumPy

首先要确保你的安装了NumPy库

pip install numpy

一般我们会给NumPy起别名为np

NumPy数组

序列生成数组

生成数组最简单的方法就是用array()方法,他可以接收任意类型的数据(列表、元组等)作为数据源

需要注意的是,如果各种数据的数据类型不统一,但是数据类型可以相互转换,就会进行自动转换,浮点数和整数都存在时,就会将整数自动转化成浮点数

每一个数组都可以利用dtype数据(ArrName.dtype)来输出数组中数据的类型,如果没有显示指定(ArrName.astype()),数组就会自动推断数据类型

例如

import numpy as np
print(np.__version__)list1 = [1, 2, 2.5, 3, 4, 5]arr1 = np.array(list1)
print(arr1.dtype)arr1 = arr1.astype(int)
print(arr1.dtype)

如果数据序列是嵌套的,而且嵌套序列是等长的,就会自动转换为高维数组,例如列表中有两个分别带有4个元素的子列表,数组就会自动变为两行四列的二维数组

函数生成数组

我们可以用arange()方法来生成数组,参数如下

arange(start, stop, step, dtype)

start与stop为起止位置,step为步长,区间为左闭右开,例如

arr3 = np.arange(1, 10, 2, int)
print(arr3)

对于数组的操作有一个是

arr3 = arr3 + 1

需要注意的是这个操作是给所有元素加1,但是这个1实际上是利用了“广播机制”,将1扩展为等长的数组,才能进行相加

range,arange,linspace

这里是三个函数,第一个是我们之前学习到的range,他的返回值本质上是一个可迭代对象,可以看作是一个迭代器,而且也有一定的局限性,例如步长只能是整数

第二个是用于创建数组的方法,步长可以是浮点数,而且他的底层其实是C语言,因此执行效率也会比较高,对于arange他的返回值就是数组对象本身了

第三个是也是用于创建数组的方法,他的好处是避免了每一次创建数组都要手动算一下步长,他的参数有三个,起始位置,停止位置,数据个数,例如

arr4 = np.linspace(1,10,20)
其他常用函数
方法说明示例
zeros生成全零数组ze = zeros((2,3)) 生成两行三列0数组
ones生成全一数组与上面一样
shape参数描述轮廓one = np.ones(shape = [3, 4], dtype = float)
zeros_like结构和某数组一样的全零数组ze1 = zeros_like(ze)
ones_like结构和某数组一样的全一数组one = zeros_like(one)

其余函数还有,empty_like、full_like,等等

N维数组的属性

我们首先要知道,内存的本质还是一维的,用狭隘的眼光来看他甚至只能从一个方向存储删除数据,因此我们所说的n维数组实际上是一个逻辑的结构,并非内存的真实结构

一个n维数组的本质就是用n个同类的数据容器来存储数据

我们可以用ndim输出数组的维度

arr1 = np.arange(1,10)
print(arr1.ndim)

同样的,我们也可以用shape查看数组的形状信息

print(arr1.shape)

我们也可以用reshape()方法来改变一维数组的形状信息,也就是重构或者说变形

arr1 = np.arange(1,10)
print(arr1.shape)
print(arr1)
arr2 = arr1.reshape(3,3)
print(arr2.shape)
print(arr2)

需要注意的是,三位数组的形状信息是分别对应着宽、高、长

NumPy数组的运算

向量运算

如果我们想求两个列表元素对应的和,我们可以使用for循环,列表推导式,也可以将他们转换为数组直接求和即可

import numpy as np
arr1 = np.arange(1,11)
arr2 = np.arange(11,21)
arr3 = arr1 + arr2
print(arr1)
print(arr2)
print(arr3)

算数运算

NumPy有着强大的算数运算函数,只需要直接调用即可

如果要进行普通的数学运算,直接跟两个数字直接运算的方法一模一样,支持加减乘除取余乘方

注意,要操作数组的形状一致,除数不要为0就行

还有许多统计函数,例如

函数说明
sum求和
min最小值
max最大值
median中位数
mean平均数
average加权平均数
std标准差
var方差
逐元素运算、点乘运算

N维数组实际上类似于矩阵,一般来说,加减乘除是元素对元素的运算

这里的乘法与矩阵乘法或是向量乘法不同,而是元素对元素的乘法

对于数学中的点乘操作NumPy也有对应的方法为dot(),也可以使用@符号替换乘法操作,意为点乘

例如

arr1 = np.arange(1, 10)
arr2 = np.arange(11, 20)
arr1 = arr1.reshape(3, 3)
arr2 = arr2.reshape(3, 3)
print(arr1*arr2)
print(arr1@arr2)
print(np.dot(arr1,arr2))

后两种符合的就是矩阵乘法的操作了

其他矩阵运算的函数

方法说明
a.I返回a的逆矩阵
a.T返回a的转置矩阵
a.A返回a对应的二维数组

操作数组元素

索引访问数组

索引是数组中元素所在的编号,类似于列表和C/C++中的数组,像一个指针一样对数组进行访问

一维数组二维数组的访问也是相同的,同样可以更改数组中的值

切片访问数组

与Python的列表一样,NumPy也可以使用切片访问和修改数据,我们可以批量获取符合要求的元素,提取出一个新的数组

例如

arr1 = np.arange(1,10)
sl = slice(2,9,2)
arr2 = arr1[sl]
print(arr2)
print(arr1)

这里的arr1表示原有数组,sl表示切片对象,是利用slice函数构造出来的,代表从2到9,步长为2,再对arr1切片得到arr2

也可以利用类似列表的切片方法arr2 = arr1[2:9:2]

转置与展平

我们可以通过transpose()方法将二维数组转置,也可以通过我们上面提到过的ArrName.T来进行转置

要将多维数组转化成一维数组,就要使用ravel()方法完成这个功能

例如

arr1 = np.arange(1,10)
arr1 = arr1.reshape(3,3)
print(arr1)
arr1 = arr1.T
print(arr1)
arr1 = arr1.ravel()
print(arr1)

屏幕截图 2023-12-24 144158.png

flatten()函数也可以进行展平操作,不同的是,flatten会重新分配内存,进行一次深拷贝,但是原数组并没有改变

NumPy的广播

实际上就是对两个数组进行加减乘除运算时,即便两个数组形状不同,NumPy会自动填充小数组中的元素来匹配大数组,这种机制也叫做广播(broadcasting),这个过程中需要的性能比较小,也无须关注实现细节

NumPy的高级索引

整数索引

这种索引的使用场景是为了补充之前的直接索引和切片索引,一旦我们想要访问的数据没有规律可循,但数据量比较大的时候,我们可以自行指定一个索引表进行访问

例如

import numpy as np
arr1 = np.arange(1,50)
index = [5,23,23,32,37,16]
print(arr1[index])

屏幕截图 2023-12-24 144943.png

如果是二维数组,只需要写一个二维索引表即可

需要注意的是,我们也可以只访问行索引和列索引,行索引直接传入一维列表即可,列索引需要用冒号隔开,在冒号之后传入一维列表即为列索引

布尔索引

这里就类似于筛选的功能,符合条件(True)的数据就会被保留下来,不符合则会被过滤

例如

arr1 = np.arange(1,50)
index = [5,23,23,32,37,16]
arr1 = arr1[index]
print(arr1[arr1<30])

屏幕截图 2023-12-24 145538.png

需要注意的是这里的arr1<30实际上就是利用了之前的广播,将30扩展成一个同样形状的数组,然后分别进行比较

数组的堆叠

这里的堆叠可以将数组理解成书,他分为三中,水平方向堆叠,类比两本书横向堆叠放,垂直方向堆叠,就是两本书纵向堆叠,深度方向堆叠就是一本书摞在另一本书上了

水平方向堆叠

hstack()这里的h表示水平,stack表示堆叠,需要注意的是,这个函数的参数是一个元组,元组内的元素可以是列表,数组等,返回结果是一个数组

例如

list1 = [[1,1,2],[3,4,4]]
list2 = [[2,3,3],[4,4,5]]
arr1 = np.hstack((list1,list2))
print(arr1)

屏幕截图 2023-12-24 150310.png

他是把两个元素的前两项叠在一起,后两项叠在一起,之后再组成一个数组

竖直方向堆叠

vstack() 例如

list1 = [[1,1,2],[3,4,4]]
list2 = [[2,3,3],[4,4,5]]
arr1 = np.vstack((list1,list2))
print(arr1)

屏幕截图 2023-12-24 150456.png

深度方向堆叠

dstack() 例如

list1 = [[1,1,2],[3,4,4]]
list2 = [[2,3,3],[4,4,5]]
arr1 = np.dstack((list1,list2))
print(arr1)

屏幕截图 2023-12-24 150654.png

这里输出的就是一个三维数组了,相当于把两片纸堆叠在一起就有了高度

要注意元素之间的对应关系

行堆叠和列堆叠

这里就好理解很多了,因为上面的三个操作是在三维空间里的堆叠,而这里只是针对二维的数据

行堆叠 column_stack()

列堆叠 row_stack()

数组的分割

分割就是与堆叠的你操作,那也就分为水平分割,垂直分割,深度分割

分别用hsplit(),vsplit(),dsplit()实现

随机数

NumPy中含有随机数模块,random

随机数其实是由随机数种子根据一定规则计算出的数值,因此只要计算方法和种子一定,随机数就是不会变了,如果不设置随机种子,就会根据系统时间生成随机种子

例如

import numpy as nprdm = np.random.RandomState(1)
np.random.seed(20231214) # 定义随机种子# 生成两行三列的随机数组,服从均匀分布
rand = np.random.rand(2,3)
print(rand)# 生成两行三列的随机数组,服从标准正态分布
randn = np.random.randn(2,3)
print(randn)# 生成两行三列的1到10的随机整数
randint = np.random.randint(1,10,(2,3))
print(randint)

屏幕截图 2023-12-24 151655.png

感谢各位的支持,如果你发现文章中有任何不严谨或者需要补充的部分,欢迎在评论区指出

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

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

相关文章

在Excel中,如何简单快速地删除重复项,这里提供详细步骤

当你在Microsoft Excel中使用电子表格时&#xff0c;意外地复制了行&#xff0c;或者如果你正在制作其他几个电子表格的合成电子表格&#xff0c;你将遇到需要删除的重复行。这可能是一项非常无脑、重复、耗时的任务&#xff0c;但有几个技巧可以让它变得更简单。 删除重复项 …

零基础快速上手HarmonyOS ArkTS开发2---ArkTS开发实践

ArkTS开发实践&#xff1a; 接着上一次零基础快速上手HarmonyOS ArkTS开发1---运行Hello World、ArkTS开发语言介绍继续&#xff0c; 在上一次对于ArkTS的基础知识进行了学习&#xff0c;依照官方的课程计划&#xff0c;还有两个具体的小案例需要来实践实践&#xff1a; 实践出…

如何更好地理解和掌握 KMP 算法?

KMP算法是一种字符串匹配算法&#xff0c;可以在 O(nm) 的时间复杂度内实现两个字符串的匹配。本文将引导您学习KMP算法&#xff0c;阅读大约需要30分钟。 1、字符串匹配问题 所谓字符串匹配&#xff0c;是这样一种问题&#xff1a;“字符串 P 是否为字符串 S 的子串&#xf…

ubuntu下docker安装,配置python运行环境

参考自: 1.最详细ubuntu安装docker教程 2.使用docker搭建python环境 首先假设已经安装了docker&#xff0c;卸载原来的docker 在命令行中运行&#xff1a; sudo apt-get updatesudo apt-get remove docker docker-engine docker.io containerd runc 安装docker依赖 apt-get…

什么是 Dubbo?它有哪些核心功能?

文章目录 什么是 Dubbo&#xff1f;它有哪些核心功能&#xff1f; 什么是 Dubbo&#xff1f;它有哪些核心功能&#xff1f; Dubbo 是一款高性能、轻量级的开源 RPC 框架。由 10 层模式构成&#xff0c;整个分层依赖由上至下。 通过这张图我们也可以将 Dubbo 理解为三层模式&…

Studio One正版多少钱 Studio One正版怎么购买

随着版权意识的增强&#xff0c;打击盗版的力度越来越大&#xff0c;现在网络上的盗版资源越来越少&#xff0c;资源少很难找是一方面&#xff0c;另一方面使用盗版软件不仅很多功能不能使用&#xff0c;而且很多盗版软件都被植入各种木马病毒&#xff0c;从而带来各种各样的风…

《工作、消费主义和新穷人》读书笔记

总结 全书前半段描写的是工作伦理论被推行的原因 &#xff0c;后半段探讨了福利国家和资本国家对于穷人的态度&#xff0c;最后描写了全球化下工作伦理从生产型社会过度到消费型社会的概念演变&#xff0c;和大众对于新穷人态度的转变。 启示 对于我的启示在前几章是最多的&…

[MySQL binlog实战] 增量同步与数据搜索~从入门到精通

学习基础知识&#xff0c;并落实到实际场景&#xff08;增量同步数据搜索&#xff09; 对基础知识不感兴趣的&#xff0c;可以直接跳到应用场景 文章目录 binlog是什么简介产生方式文件格式statementrowmixed 怎么办开启 binlog查看 binlog其他查看相关命令运维查看 binlog设置…

FHE简介

1. 引言 加密技术已经存在了数千年&#xff0c;用于相互发送秘密信息。例如&#xff0c;凯撒密码是最早的加密技术之一&#xff0c;可以追溯到公元前60年&#xff0c;其只由字母表中的字母交换组成。 随着互联网的出现&#xff0c;人们生成的私人数据量呈指数级增长&#xff…

图像识别SLIC、Haralick texture features(自备)

SLIC 简单线性迭代聚类(SLIC ),它采用k-means聚类方法来有效地生成超像素。 SLIC超像素分割详解&#xff08;一&#xff09;&#xff08;二&#xff09;&#xff08;三&#xff09;_超像素分割 样本-CSDN博客 超像素分割 & SLIC算法 & 使用示例_slic分割算法matlab-C…

12_图的进阶

12_图的进阶 一、有向图有向图的定义及相关术语有向图API设计有向图实现 二、拓扑排序检测有向图中的环检测有向环的API设计 基于深度优先的顶点排序顶点排序API设计 拓扑排序实现 三、加权无向图加权无向图的实现 四、最小生成树最小生成树定义及相关约定最小生成树原理树的性…

详解Vue3中的内置组件(transition)

本文主要介绍Vue3中的内置组件&#xff08;transition&#xff09;的普通写法和setup写法。 目录 一、在普通写法中使用内置组件&#xff08;transition&#xff09;二、在setup写法中使用内置组件&#xff08;transition&#xff09;三、使用注意项 在Vue3中&#xff0c;内置了…