Python Numpy库的超详细介绍

article/2025/9/10 13:02:50

Numpy库是Python中的一个科学计算库,本文主要介绍了ndarray的基本操作、 ndarray运算等各种Numpy库的超详细教程,需要的朋友可以参考下

1、Numpy概述

1.1 概念

Python本身含有列表和数组,但对于大数据来说,这些结构是有很多不足的。由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针。对于数值运算来说这种 结构比较浪费内存和CPU资源。至于数组对象,它可以直接保存 数值,和C语言的一维数组比较类似。但是由于它不支持多维,在上面的函数也不多,因此也不适合做数值运算。Numpy提供了两种基本的对象:ndarray(N-dimensional Array Object)和 ufunc(Universal Function Object)。ndarray是存储单一数据类型的多维数组,而ufunc则是能够对数组进行处理的函数。

1.2 功能

  • 创建n维数组(矩阵)
  • 对数组进行函数运算,使用函数计算十分快速,节省了大量的时间,且不需要编写循环,十分方便
  • 数值积分、线性代数运算、傅里叶变换
  • ndarray快速节省空间的多维数组,提供数组化的算术运算和高级的 广播功能。

1.3 对象

  • NumPy中的核心对象是ndarray
  • ndarray可以看成数组,存放同类元素
  • NumPy里面所有的函数都是围绕ndarray展开的


    ndarray 内部由以下内容组成:
    • 一个指向数据(内存或内存映射文件中的一块数据)的指针。
    • 数据类型或 dtype,描述在数组中的固定大小值的格子。
    • 一个表示数组形状(shape)的元组,表示各维度大小的元组。形状为(row×col)

1.4 数据类型

numpy 支持的数据类型比 Python 内置的类型要多很多,基本上可以和C语言的数据类型对应上主要包括int8、int16、int32、int64、uint8、uint16、uint32、uint64、float16、float32、float64

1.5 数组属性

属性说明
ndarray.ndim秩,即轴的数量或维度的数量
ndarray.shape数组的维度(n×m),对于矩阵,n 行 m 列
ndarray.size数组元素的总个数,相当于 .shape 中 n*m 的值
ndarray.dtypendarray 对象的元素类型
ndarray.itemsizendarray 对象中每个元素的大小,以字节为单位
ndarray.flagsndarray 对象的内存信息
ndarray.realndarray元素的实部
ndarray.imagndarray元素的虚部
ndarray.data包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。

2、Numpy数组操作

2.1 Numpy创建

2.1.1 利用列表生成数组

1

2

3

4

5

6

import numpy as np

lst = [1, 2, 3, 4]

nd1 = np.array(lst)

print(nd1, type(nd1))

#[1 2 3 4] <class 'numpy.ndarray'>

2.1.2 利用random模块生成数组

下面是random模块的一些常用函数
::: hljs-center

使用如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

import numpy as np

#0到1标准正态分布

arr1 = np.random.randn(3, 3)

#0到1均匀分布

arr2 = np.random.rand(3, 3)

#均匀分布的随机数(浮点数),前两个参数表示随机数的范围,第三个表示生成随机数的个数

arr3 = np.random.uniform(0, 10, 2)

#均匀分布的随机数(整数),前两个参数表示随机数的范围,第三个表示生成随机数的个数

arr4 = np.random.randint(0, 10, 3)

print(f'arr1 : {arr1}\narr2 : {arr2}\narr3 : {arr3}\narr4 : {arr4}')

out :

# arr1 : [[-0.31637952 -0.08258995  1.43866984]

#  [-0.11216775  0.43881134  0.11745847]

#  [-1.1770306  -0.97657465  2.2368878 ]]

# arr2 : [[0.16350611 0.4467384  0.9465067 ]

#  [0.1882318  0.40261184 0.93577701]

#  [0.56243911 0.69179631 0.83407725]]

# arr3 : [4.41402883 6.03259052]

# arr4 : [9 7 7]

如果想使每次生成的数据相同,可以指定一个随机种子

1

2

3

4

5

import numpy as np

np.random.seed(123)

arr = np.random.rand(2, 3)#[[0.69646919 0.28613933 0.22685145] [0.55131477 0.71946897 0.42310646]]

#打乱数组

np.random.shuffle(arr)#[[0.55131477 0.71946897 0.42310646] [0.69646919 0.28613933 0.22685145]]

2.1.3 创建特定形状数组

主要有如下几种:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

import numpy as np

#未初始化的数组

arr1 = np.empty((2,3))

#数组元素以 0 来填充

arr2 = np.zeros((2, 3))

#数组元素以 1 来填充

arr3 = np.ones((2, 3))

#数组以指定的数来进行填充,这里举例3

arr4 = np.full((2, 3), 3)

#生成单位,对角线上元素为 1,其他为0

arr5 = np.eye(2)

#二维矩阵输出矩阵对角线的元素,一维矩阵形成一个以一维数组为对角线元素的矩阵

arr6 = np.diag(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]))

在创建给定长度的等差数列时,要注意的是np.linspace形成的数组一定包括范围的首位两个元素,则步长为(end - start) / (length - 1)。而np.arange是自己指定的步长(默认为1)也就意味着形成的数组不一定包括末尾数

1

2

arr7 = np.linspace(0, 1, 4) #out : array([0.        , 0.33333333, 0.66666667, 1.        ])

arr8 = np.arange(0, 9, 2) #out : array([0, 2, 4, 6, 8])

2.2 索引和切片

Numpy可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样,设置start, stop 及 step 参数。

2.2.1 元素表示

Numpy数组的下标表示与list是一样的,对于矩阵来说,要注意中括号里要用逗号将行和列的表示进行分隔。基本的表示方法如下图,左边为表达式,右边为表达式获取的元 素。注意,不同的边界,表示不同的表达式。

例子:
a = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
a[0] : 指的是第一行
a[1, 2] 或者 a[1][2] : 全下标定位单个元素,在a中表示7这个元素

2.2.2 切片表示

若a = np.arange(10),b = a[2 : 7 : 2]则表示从索引 2 开始到索引 7 停止,间隔为 2,即b为[2, 4, 6]。此外也可以通过切片操作来对元素进行修改,如:

1

2

3

a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

a[0 , 1 : 3] = 100, 101#a[0 , 1 : 3]表示第一行的第二列和第二列即[2, 3]

a #out : array([[  1, 100, 101], [  4,   5,   6], [  7,   8,   9]])

2.2.3 多维数组的切片

NumPy的多维数组和一维数组类似。多维数组有多个轴。从内到外分别是第0轴,第1轴,第2轴......切片后的数据与切片前的数据共享原数组的储存空间

当然,切片操作是针对我们想要获取的数据是连续的,如果我们想要获取离散数据就不能使用切片的方法,再者就是我们不能一个一个来进行提取,Numpy有一种很方便的方法可以获得离散数据。即下面

1

2

3

4

5

x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])

rows = np.array( [ [0,0],[3,3] ] ) #表示第1、4行

cols = np.array( [ [0,2],[0,2] ] ) #表示第1、3列

y = x[rows,cols]

y # out : array([[ 0,  2], [ 9, 11]])

2.2.4 布尔索引

顾名思义,通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。

1

2

3

4

x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])

print(x[x > 5]) # out : [ 6  7  8  9 10 11]

b = x > 5

b # 打印布尔运算的结果

2.2.5 元素查找定位

Numpy库中提供了where函数来查找满足条件元素的索引,表示如下:

  • np.where(condition, x, y): 满足条件(condition),输出x,不满足输出y
  • np.where(condition): 输出满足条件 (即非0) 元素的坐标

1

2

3

a = np.array([2,4,6,8,10,3]).reshape(2,3)

c = np.where(a > 5) # 返回索引 out : (array([0, 1, 1], dtype=int64), array([2, 0, 1], dtype=int64))

a[c] # 获得元素

2.2.6 元素删除

np.delete(arr, obj, axis=None)

  • 第一个参数:要处理的矩阵,
  • 第二个参数,处理的位置,下标
  • 第三个参数,0表示按照行删除,1表示按照列删除,默认为0
  • 返回值为删除后的剩余元素构成的矩阵

1

2

arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])

np.delete(arr, [1], 0) # 表示删除第二行

转自:https://www.weidianyuedu.com


http://chatgpt.dhexx.cn/article/hnKUViaX.shtml

相关文章

python进阶--Numyp库(一)

一、Numpy库介绍 NumPy&#xff08;Numerical Python&#xff09;是Python的⼀种开源的数值计算扩展。提供多维数组对象&#xff0c;各种派⽣对象&#xff08;如掩码数组和矩阵&#xff09;&#xff0c;这种⼯具可⽤来存储和处理⼤型矩阵&#xff0c;⽐Python⾃身的嵌套列表&am…

解决端口8080被占用的问题!

今天在回顾cms项目的时候发现怎么都启动不了&#xff0c;看见左下角报错 原来是8080端口被别的进程占用了。 解决方法&#xff1a;winr cmd 回车 在命令窗口中 输入netstat -ano就可以查看所有端口显示的状态信息 找到这个本地地址是0.0.0.0:8080最后面的PID&#xff0c;就是…

8080端口被占用怎么办

做项目时肯定会遇到8080端口被占用的情况&#xff0c;其实解决办法很简单&#xff1a; CtrlR键&#xff0c;输入cmd: 复制这串代码到cmd界面&#xff1a; netstat -aon|findstr "8080" 可以看到8080确实被占用了&#xff1a; 把后面的都终止掉&#xff…

解决localhost:8080被占用

解决方法如下&#xff1a; 1.以管理员方式打开CMD&#xff0c;我的电脑——c盘——windows——system32——CMD.exe——右键管理员身份打开 1.在cmd里输入netstat -ano|findstr 8080&#xff0c;查看是哪个进程占用了8080端口。 2.输入taskkill /pid 11904 /f&#xff0c;结束…

解决SpringBoot默认Tomcat端口号8080被占用

问题描述&#xff1a; 打开Eclipse后启动SpringBoot项目&#xff0c;发现8080端口被占用。然后寻找Eclipse是否有未关闭的Tomcat项目&#xff0c;发现并没有&#xff0c;重启Eclipse仍然会出现端口占用的请况。 给出的错误信息显示。 Description: The Tomcat connector co…

解决tomcat端口8080被占用

1、eclipse启动tomcat时8080端口被占用&#xff1a; 2、打开CMD&#xff1a; 命令查找正在使用8080端口的进程&#xff0c; netstat -ano|findstr 8080 杀死该进程&#xff0c; taskkill /pid 117800 /f 命令说明&#xff1a;taskkill /pid 117800&#xff08;进程id号&am…

idea报8080端口被占用解决

1错误提示 Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port. 2原因 这是因为我们某个程序占用了8080端口&#xff0c;有可能是我们以前某个项目没有正确暂停导致。 3解决 1&#xff1a;打开cmd窗…

Tomcat 8080 端口被占用解决方案

1. 报错记录 原因&#xff1a;端口号8080被其他应用程序占用 2. 解决方案 方案一&#xff1a;结束占用端口程序 在Windows控制台中输入下面内容查询占用8080端口的进程id netstat -ano|findstr "8080" ctrlshiftesc打开任务管理器&#xff0c;在服务通过pid找到占用程…

解决8080端口号被占用问题

在使用TomCat时偶尔会出现8080端口被占用的提示&#xff0c;为此总结出如下解决方法&#xff1a; 1.以管理员身份打开命令提示符 2.输入netstat -ano|findstr "8080" 3. 上图最右边的6636、3280、6636为进程id,接下来就要结束这些进程 4.输入taskkill /f /pid 663…

解决windows系统下8080端口被占用

1.winR&#xff1a;输入cmd&#xff0c;回车 输入指令&#xff1a;netstat -ano | findstr 8080 指令的意思是找出占用8080端口的进程pid 2. 此时找到8080端口号的pid是11660&#xff08;pid是会变化的&#xff09; 终止进程 释放端口 输入指令&#xff1a;taskkill …

解决SpringBoot8080端口被占用问题

问题描述&#xff1a; 大致意思是我们使用的8080端口已经被占用了。 解决方法&#xff1a; 方法一&#xff1a;修改我们要使用的端口 在resource目录下面找到application.properties然后输入 server.port 8081&#xff08;注意&#xff1a;这里不一定非要是8081&#xff0c;…

解决tomcat 8080端口被占用问题

首先&#xff0c;我们要看一下究竟是什么占用了8080端口&#xff1a; winr 打开运行窗口输入 cmd 输入 netstat -ano 查看开放的所有端口 端口太多&#xff0c;我们可以使用 netstat -ano|findstr "端口号" 查看占用8080端口的进程 netstat -ano|findstr "8080…

Ubuntu的8080端口被占用

因为最近学习web建站技术&#xff0c;弄了好多环境&#xff0c;今天开机启动服务的时候报了如下错误&#xff1a; 意思就是我的8080端口已经被别的进程占用了&#xff0c;导致服务启动异常。解决办法so easy, 找到占用8080端口的进程&#xff0c;直接kill掉就好啦。百度一下&a…

8080端口被占用

当我们执行spring项目或者关闭spring项目新建另外一个spring项目时&#xff0c;idea后台显示 ‘8080’ 端口已被占用。 解决方法&#xff1a; 1.快捷键&#xff1a;winR 打开 2.输入cmd 3.在dos命令中输入 netstat -aon|findstr “8080” &#xff1a;查找pid 4.在任务管理器…

新建服务器显示8080被占用,快速解决eclipse/myeclipse下的tomcat服务器端口号8080被占用的简单方法...

使用过tomcat服务器的人都会不可避免的遇到tomcat端口号被占用的情况。tomcat端口号被占用造成的原因很多&#xff0c;但本文只是针对由于打开多个版本的eclipse/myeclipse或者是tomcat端口关闭不正常造成的tomcat端口号被占用的现象。 一般情况下会比较少遇到上述的两种情况&a…

2012年度最受欢迎中国开源软件评选

http://www.oschina.net/project/top_cn_2012 afinal Afinal 是一个android的 orm 和 ioc 框架。而且封装了android中的httpClient&#xff0c;使其更加简单易用。使用finalBitmap&#xff0c;无需考虑bitmap在and... 当前票数&#xff1a; 957 投票 Alice UI Alice 是支付宝前…

参与评选开源软件名单

afinal Afinal 是一个android的 orm 和 ioc 框架。而且封装了android中的httpClient&#xff0c;使其更加简单易用。使用finalBitmap&#xff0c;无需考虑bitmap在and... 当前票数&#xff1a; 957 投票 Alice UI Alice 是支付宝前端样式解决方案小组的项目代称&#xff0c;其包…

中文分词

&#xfeff;&#xfeff; MFSOU中文分词PHP扩展 一个PHP函数实现中文分词。使分词更容易&#xff0c;使用如下图: SCWS调用示例 SCWS Hightman开发的一套基于词频词典的机械中文分词引擎&#xff0c;它能将一整段的汉字基本正确的切分成词。采用的是采集的词频词典&#xff0c…

中文分词 及发展现状(总结的不错)

中文分词 (Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。我们知道&#xff0c;在英文的行文中&#xff0c;单词之间是以空格作为自然分界符的&#xff0c;而中文只是字、句和段能通过…

中文分词整理

背景 存在中文 分词技术&#xff0c;是由于中文在基本文法上有其特殊性&#xff0c;具体表现在&#xff1a; 1&#xff0e;以英文为代表的拉丁语系语言相比&#xff0c;英文以空格作为天然的分隔符&#xff0c;而中文由于继承自古代汉语的传统&#xff0c;词语之间没有分隔。 …