【Python】Python之Numpy的超实用基础详细教程

article/2025/10/15 15:17:32

Numpypython中属于非常常用的包,无论是机器学习搭配pandas,还是数据可视化搭配pylab都是很正常的搭配。


Numpy

numpy的官方中文文档:NumPy 中文

NumPy是使用Python进行科学计算的基础软件包。除其他外,它包括:

  • 功能强大的N维数组对象;
  • 精密广播功能函数;
  • 集成C/C+Fortran代码的工具;
  • 强大的线性代数、傅立叶变换和随机数功能。

更简单的说,NumpyPythonMatlab数学计算包。使用它,python可以更简单便捷地对矩阵向量进行计算。

一般来说,我们引用该包并将其简称为np

import numpy as np

Numpy的ndarry对象

ndarray的创建

Numpy中最重要的数据类型就是:N维数组对象ndarray。它是一系列同类型数据的集合,以0下标为开始进行集合中元素的索引。

它具有以下两个特点:

  • ndarray对象是用于存放同类型元素的多维数组;
  • ndarray中的每个元素在内存中都有相同存储大小的区域。

创建一个ndarray对象:

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

参数说明:

名称描述
object数组或嵌套的数列
dtype数组元素的数据类型,可选
copy对象是否需要复制,可选
order创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
subok默认返回一个与基类类型一致的数组
ndmin指定生成数组的最小维度

一般而言,并不需要记住这么多可选参数:

import numpy as npif __name__ == "__main__":x = np.array([1, 2, 3])print(x)

运行该脚本:

yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py 
[1 2 3]

当然,除了之前的array方法创建ndarray对象之外,还提供了另外的几种创建方式:

np.empty(shape, dtype = float, order = 'C')         # 指定形状的未初始化数组np.zeros(shape, dtype = float, order = 'C')         # 指定形状的全0数组
np.ones(shape, dtype = None, order = 'C')           # 指定形状的全1数组np.arange(start = 0, stop, step = 1, dtype)         # 从起始值到终止值(不包含)时,按步长从范围内创建数组np.linspace(start, stop, num = 50, endpoint = True, retstep = False, dtype = None)   # 从起始值到终止值(默认包含)创建一个等差数组的一维数组
np.logspace(start, stop, num = 50, endpoint = True, base = 10.0, dtype = None)  # 从起始值到终止值(默认包含)创建一个等比数组的一维数组

Numpy也提供了从python其他类型直接转换成ndarray的方式:

np.asarray(a, dtype = None, order = None)           # 列表形式
np.frombuffer(buffer, dtype = float, count = -1, offset = 0)            # 以流的形式读入
np.fromiter(iterable, dtype, count=-1)          # 从可迭代对象中,以迭代器的形式读入

例如:

import numpy as npif __name__ == "__main__":a = [[1, 2 ,3], [4, 5]]b = 'Hello World'c = iter(range(5))x = np.asarray(a)y = np.frombuffer(b, dtype = 'S1')z = np.fromiter(c, dtype = float)print(x)print(y)print(z)

运行该脚本:

yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py 
[list([1, 2, 3]) list([4, 5])]
['H' 'e' 'l' 'l' 'o' ' ' 'W' 'o' 'r' 'l' 'd']
[0. 1. 2. 3. 4.]

ndarray的数据结构

Numpy支持很多的数据类型,下面就简单地列举一下:

名称描述
bool_布尔型数据类型(True或者False)
int_/int8/int16/int32/int64有符号整数
uint8/uint16/uint32/uint64无符号整数
float_/float16/float32/float64浮点数
complex_/complex64/complex128复数

但如果是自定义的数据类型,就需要通过dtype来确定了:

numpy.dtype(object, align, copy)

参数说明:

名称描述
object要转换为的数据类型对象
align如果为true,填充字段使其类似C的结构体
copy复制dtype对象 ,如果为false,则是对内置数据类型对象的引用

例如,可以创建一个student的对象:

import numpy as npif __name__ == "__main__":student = np.dtype([('name', 'S20'), ('age', 'i8'), ('score', 'f4')])a = np.array([('zhangsan', 18, 80), ('lisi', 19, 85)], dtype=student)print(a)

运行该脚本:

yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py 
[('zhangsan', 18, 80.) ('lisi', 19, 85.)]

ndarray的属性

ndarray有两个非常常用的属性,shapesizeshape表示数组的维度,对于二维数组而言,就是其行数和列数;size表示数组元素的总个数,对于二维数组而言,就是行数与列数的相乘

例如:

import numpy as npif __name__ == "__main__":a = np.array([[1, 2, 3], [4, 5, 6]])print(a.shape)print(a.size)

运行该脚本:

yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py 
(2, 3)
6

当然,ndarray对象提供了两种方式在不改变数据内容的情况下,改变一个数组的格式。但两种方式有所区别:

import numpy as npif __name__ == "__main__":a = np.array([[1, 2, 3], [4, 5, 6]])a.shape = (3, 2)                  # 直接改变本体print(a)b = a.reshape(2, 3)               # 本体不改变,将改变后的对象返回print(b)

运行该脚本:

yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py 
[[1 2][3 4][5 6]]
[[1 2 3][4 5 6]]

ndarray的内容访问

ndarray对象的内容可以通过索引或切片来访问和修改,与pythonlist的切片操作一样。

ndarray既可以基于下标进行切片,也可以通过内置的slice函数,并设置start,stop及step参数进行,从原数组中切割出一个新数组

例如:

import numpy as npif __name__ == "__main__":a = np.arange(10)b = a[1:7:1]s = slice(1,7,1)c = a[s]print(a)print(b)print(c)

运行该脚本:

yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py 
[0 1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6]
[1 2 3 4 5 6]

对于冒号:的解释:

  • 如果是一维数组,如果只放置一个参数,如[2],将返回与该索引相对应的单个元素。如果为[2:],表示从该索引开始以后的所有项都将被提取。如果使用了两个参数,如[2:7],那么则提取两个索引(不包括停止索引)之间的项;
  • 如果是多维数组,使用,区分维数。

例如:

import numpy as npif __name__ == "__main__":a = np.arange(25)a.shape = (5, 5)b = a[1:4, 2:4]print(a)print(b)

运行该脚本:

yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py 
[[ 0  1  2  3  4][ 5  6  7  8  9][10 11 12 13 14][15 16 17 18 19][20 21 22 23 24]]
[[ 7  8][12 13][17 18]]

ndarray除了基于下标进行切片,还有一些高级索引方式,比如布尔索引、花式索引。

例如:

import numpy as npif __name__ == "__main__":a = np.arange(25)a.shape = (5, 5)b = a[a > 6]c = a[[3, 2, 4]]print(a)print(b)print(c)

运行该脚本:

yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py 
[[ 0  1  2  3  4][ 5  6  7  8  9][10 11 12 13 14][15 16 17 18 19][20 21 22 23 24]]
[ 7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24]
[[15 16 17 18 19][10 11 12 13 14][20 21 22 23 24]]

其他

判断元素对象是都为NaN

np.isnan(...)

ndarray的对象转为list

obj.tolist()

Numpy的广播

如果两个ndarrayab形状相同,即满足a.shape==b.shape,那么ab的算数结果就是ab数组对应位做算术运算。这要求维数相同,且各维度的长度相同

例如:

import numpy as npif __name__ == "__main__":a = np.array([1, 2, 3])b = np.array([1, 2, 3])c = a + bd = a * bprint(c)print(d)

运行该脚本:

yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py 
[2 4 6]
[1 4 9]

而,广播是Numpy对不同形状(shape)的ndarray进行数值计算的方式,对ndarray的算术运算通常在相应的元素上进行

怎么才算是相应的元素呢?

虽然,广播是对不同形状(shape)而言,但其实还是要满足两个条件:列数相同,有一个行数为1。在这个前提下,每行的相同列的元素就是相对应的元素。

直接看文字可能还是有点不太能理解,可以看一下例子:

import numpy as npif __name__ == "__main__":a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])b = np.array([1, 2, 3])c = a + bd = a * bprint(c)print(d)

运行该脚本:

yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py 
[[ 2  4  6][ 5  7  9][ 8 10 12]]
[[ 1  4  9][ 4 10 18][ 7 16 27]]

所谓广播就是:当列数相同的时候,行数为1的ndarray会进行扩行的操作,增加的行数内容与原行的内容相同

扩行的实现可以通过tile函数实现:

np.tile(obj, (,))       # 在行上和列上分别重复一定的次数

所以,上文的广播也可以通过下面的方式来代替:

import numpy as npif __name__ == "__main__":a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])b = np.array([1, 2, 3])bb = np.tile(b, (3, 1))c = a + bbd = a * bbprint(bb)print(c)print(d)

运行该脚本:

yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py 
[[1 2 3][1 2 3][1 2 3]]
[[ 2  4  6][ 5  7  9][ 8 10 12]]
[[ 1  4  9][ 4 10 18][ 7 16 27]]

ndarray的函数

ndarray提供了很多的数学函数、算术函数、排序函数,以便进行运算。

ndarray的数学函数,例如:

np.pi                   # 圆周率
np.sin(obj)             # 三角运算
np.cos(obj)
np.tan(obj)
np.arcsin(obj)          # 反三角运算
np.arccos(obj)
np.arctan(obj)
np.degrees(obj)         # 将弧度值转换为角度值np.around(obj, decimals)  # 返回ndarray每个元素的四舍五入值,decimals为舍入的小数位数,默认为0
np.floor(obj)           # 向下取整
np.ceil(obj)            # 向上取整

ndarray的算术函数,例如:

np.add(obj1, obj2)                # 加减乘除运算,与+-*/效果一致,需要符合广播原则
np.subtract(obj1, obj2)
np.multiply(obj1, obj2)
np.divide(obj1, obj2)
np.mod(obj1, obj2)                # 求余数运算np.reciprocal(obj)                # 元素取倒数np.power(obj1, obj2)              # 计算前参数为底,后参数为幂的值

ndarray的排序函数,例如:

np.sort(obj, axis=1, kind='quicksort', order)

参数说明:

名称描述
obj数组或嵌套的数列
axisaxis=0按列排序,axis=1按行排序
kind‘quicksort’、‘mergesort’、‘heapsort’
order如果数组包含字段,则是要排序的字段

相关阅读

python中的numpy模块


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

相关文章

numpy入门详细教程(一)

本讲主要介绍对numpy库和numpy库的N维数组对象:ndarray的基本了解。更多内容请看numpy入门详细教程(二) numpy: NumPy是一个开源的Python科学计算基础库,包含: • 一个强大的N维数组对象 ndarray • 广播功能函数 • 整合C/C/Fortran代码的工具 • 线性代数、傅里…

Python基础 Numpy菜鸟教程

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。 NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发,2005 年,Travis Oliphant…

Numpy教程(一)

参考资料:清华计算机博士带你学-Python金融量化分析 目录 demo1-numpy与for循环对比 demo2-向量内(点)积求和(对应位置相乘) demo3-ndarray常见属性 demo4-数组的创建 demo5-批量运算 demo6-索引与切片 demo7-布…

NumPy进阶教程——超详细

Numpy基础教程: https://blog.csdn.net/qq_43328040/article/details/106601065 ———————————————————————————————————— 文章目录 一.ndarray对象内幕1.1 Numpy dtype 层次结构 二.高阶数组操作2.1重塑数组2.2 C顺序和Fortran…

Numpy安装教程

一、查看自己的python版本 使用winR弹出搜索框,输入cmd打开命令提示符,在其中输入python并按回车,得到以下结果 查看自己使用的python版本 二、下载对应的Numpy版本 Python Extension Packages for Windows - Christoph Gohlke (uci.edu) 可…

Python Numpy库教程(超详细)

1 Numpy概述 1.1 概念 Python本身含有列表和数组,但对于大数据来说,这些结构是有很多不足的。由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针。对于数值运算来说这种 结构比较浪费内存和CPU资源。至于数组对象,它…

Python基础(十) | Numpy详细教程

⭐本专栏旨在对Python的基础语法进行详解,精炼地总结语法中的重点,详解难点,面向零基础及入门的学习者,通过专栏的学习可以熟练掌握python编程,同时为后续的数据分析,机器学习及深度学习的代码能力打下坚实…

【python学习】最全Numpy教程

1. Numpy概述 NumPy(Numerical Python的简称)是Python数值计算最重要的基础包。大多数提供科学计算的包都是用NumPy的数组作为构建基础。1.1.1. Why NumPy? 1.一个强大的N维数组对象ndarray,具有矢量算术运算和复杂广播能力的快速且节省空…

Python Numpy库教程

目录 1 Numpy概述1.1 概念1.2 功能1.3 对象1.4 数据类型1.5 数组属性 2 Numpy数组操作2.1 Numpy创建2.1.1 利用列表生成数组2.1.2 利用random模块生成数组2.1.3 创建特定形状数组 2.2 索引和切片2.2.1 元素表示2.2.2 切片表示2.2.3 多维数组的切片2.2.4 布尔索引2.2.5 元素查找…

【数据分析】Numpy入门教程(超详细)

Numpy 教程 什么是Numpy?Numpy(Numerical Python)是一个Python扩展库,支持大量的维度数组和矩阵运算,此外也针对数组运算提供大量的数学函数库。 其主要用于数组计算,特点包括: 一个强大的N维数组对象ndarray广播功…

Python之Numpy详细教程

NumPy - 简介 NumPy 是一个 Python 包。 它代表 “Numeric Python”。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。 Numeric,即 NumPy 的前身,是由 Jim Hugunin 开发的。 也开发了另一个包 Numarray ,它拥有一些额外的功能。…

Java泛型方法的定义和使用

目录 一、基本介绍1、Java泛型的基本语法格式为:2、在使用泛型时,还需要注意以下几点:二、泛型的优点1、类型安全2、消除强制类型转换3、更高的效率4、潜在的性能收益三、常见泛型字母含义四、使用泛型时的注意事项五、泛型的使用1、泛型类2、泛型接口3、泛型通配符4、泛型方…

java参数传入泛型类型_java泛型方法参数传递

Java参数,不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通常是相对传址而言)。 如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个…

Java 泛型作为方法参数

Java 泛型作为方法参数 例程源码&#xff1a; import java.util.List;public class GoodsSeller {public void sellGoods(List<? extends Goods> goods){//调用集合中的sell方法for(Goods g:goods){g.sell();}} }public class Book extends Goods {Overridepublic void …

49天精通Java,第32天,Java泛型方法的定义和使用

🏆作者简介:哪吒,CSDN2022博客之星Top1、CSDN2021博客之星Top2、多届新星计划导师✌、博客专家💪 ,专注Java硬核干货分享,立志做到Java赛道全网Top N。 🏆本文收录于Java基础教程(入门篇),包含面向对象、基本数据类型、数组、继承和多态、泛型、枚举等Java基础知识…

java泛型 方法返回值带有泛型 <T>

方法返回值前的<T>的左右是告诉编译器&#xff0c;当前的方法的值传入类型可以和类初始化的泛型类不同&#xff0c;也就是该方法的泛型类可以自定义&#xff0c;不需要跟类初始化的泛型类相同。 转自&#xff1a;https://blog.csdn.net/huyashangding/article/details/9…

Java 泛型方法/接口、泛型限定

文章目录一、为什么要定义泛型方法1、从泛型类到泛型方法的演变过程2、定义泛型方法的好处二、创建一个泛型方法格式常用的形式三、泛型接口1、格式2、例子四、类型通配符(泛型的高级应用)1、什么是通配符 (?)2、类型通配符上限定(? extends T >可以接收T类型或者T的子类型…

Java 泛型方法

本文包含&#xff1a; 定义泛型方法泛型方法和类型通配符的区别Java 7 的“菱形”语法与泛型构造器设定通配符下限泛型方法与方法重载Java 8 改进的类型推断 1. 定义泛型方法 假设需要实现这样一个方法&#xff1a;该方法负责将一个 Object 数组的所有元素添加到一个 Collec…

【java】泛型方法的定义

一、定义泛型方法的格式 二、调用泛型方法的语法格式 三、解释 1、定义泛型方法时&#xff0c;必须在返回值前边加一个<T>&#xff0c;来声明这是一个泛型方法&#xff0c;持有一个泛型T&#xff0c;然后才可以用泛型T作为方法的返回值。 2、Class<T>的作用就是指…

Java 中的泛型(两万字超全详解)

文章目录 前言一、泛型概述1. 什么是泛型&#xff1f;为什么要使用泛型&#xff1f;2. 泛型使用场景3. 泛型概述小结 二、泛型类1. 泛型类的定义2. 泛型类的使用 三、泛型接口四、泛型方法1. 泛型方法的定义2. 泛型方法的使用3. 泛型方法中的类型推断 五、类型擦除1. 什么是类型…