Python Numpy 库:Ndarray 对象
本文仅介绍 ndarray 对象的基本操作,更多数学运算功能可以查阅说明文档或其他教程使用。
Numpy#
NumPy(Numerical Python) 是 Python 的一个开源数值计算扩展库,可以用于大量的维度数组与矩阵的存储于运算,同时对数组运算提供大量的数学函数。相比 Python 本身提供的列表实现的多位数据结构,Numpy 提供的结构的预算将比嵌套列表效率更高,而且更节省资源。同时 Numpy 库也经常搭配很多数据处理或科学计算库使用,可以进入 Numpy 的官网或NumPy 官方中文文档做进一步了解。
NumPy 主要包含的组件和功能有:
- N 维数组对象 Ndarray
- 广播功能函数
- 整合 C/C++/Fortran 代码的工具
- 线性代数、傅里叶变换、随机数生成等功能
NumPy 安装并使用#
安装#
在 cmd 命令下输入命令,等待安装完成即可。
pip install numpy
Anaconda 环境下配置就很简单了,找到 Numpy 库勾上就行,默认是启用的。
使用#
想要使用 Numpy 库,就需要把 Numpy 库包含进来,代码如下。一般为了简化 Numpy 库的调用,约定俗成把 Numpy 简化为 np。
import numpy as np
Ndarray 对象创建#
NumPy 提供了一个 N 维数组对象 ndarray,用于存放同类型元素的多维数组,同样是以 0 为开始用下标索引。
根据参数创建#
利用向方法传递参数创建 ndarray 对象方法有:
方法 | 说明 |
---|---|
np.empty(shape, dtype) | 生成 shape 形状且元素类型为 dtype 的未初始化数组 |
np.ones(shape, dtype) | 生成 shape 形状的元素全为 dtype 类型的 1 数组 |
np.zeros(shape, dtype) | 生成 shape 形状的元素全为 dtype 类型的 0 数组 |
np.full(shape, val, dtype) | 生成 shape 形状的元素全为 dtype 类型且数值为 val 数组 |
np.eye(n) | 生成 n*n 的单位矩阵 |
例如如下代码将分别生成形状为 2 行 3 列(元祖表示)的未初始化、全为 1,全为 0 和全为 val(8) 的矩阵:
a = np.empty((2,3), dtype = int)
a = np.ones((2,3), dtype = int)
a = np.zeros((2,3), dtype = int)
a = np.full((2,3), 8, dtype = int)
它们生成的 ndarray 对象如下,由于 empty() 方法生成的是未初始化的矩阵,因此数组中的元素随机。
如下代码将生成 0 到 n‐1 (n=5)的数组。
a = np.arange(n, dtype = int)
a = np.eye(5)
生成数列#
ndarray 对象可以以一维数组的方式生成一些数列,常用生成数列的方法有 2 个。
np.arange(start, stop, step, dtype)
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype)
arange 方法的参数说明如下:
参数 | 说明 |
---|---|
start | 起始值(默认为 0) |
stop | 终止值 |
step | 步长(默认为 1) |
dtype | 数组元素的数据类型 |
例如下面的 2 行代码分别是用终值生成数列、加上初始值和步长生成数列。
a = np.arange(7)
a = np.arange(5, 25, 5)
参数 | 说明 |
---|---|
start | 起始值(默认为 0) |
stop | 终止值 |
num | 生成的等步长的样本数量,默认为 50 |
endpoint | 该值为 true 时数列中包含 stop 值,反之不包含 |
dtype | 数组元素的数据类型 |
例如生成初值为 2,终值为 10 且包含 5 个样本的数列代码为:
a = np.linspace(2, 10, 5)
基于现有结构#
ndarray 对象可以从现有的结构转换,例如用列表和元素进行转换,使用的方法如下。
np.array(list/tuple, dtype)
例如先定义一个列表,然后用这个列表生成 ndarray 对象。
alist = [1, 2, 3, 4, 5]
a = np.array(alist)
array 方法的效果如下。
顺带一提 tolist() 方法可以把 ndarray 对象转换为列表,例如如下代码:
alist = a.tolist()
如下 3 个方法可以用现有 ndarray 对象的形状生成新数组,分别是:
方法 | 说明 |
---|---|
np.ones_like(array) | 根据 array 的形状生成新的全 1 数组 |
np.zeros_like(array) | 根据 array 的形状生成新的全 0 数组 |
np.full_like(array,val) | 根据 array 的形状生成新的全 val 数组 |
例如先生成一个 2 行 3 列的矩阵,然后分别生成全 1、全 0 和全 6 的数组。
a = np.empty((2,3), dtype = int)
b = np.ones_like(a)
b = np.zeros_like(a)
b = np.full_like(a,6)
Ndarray 对象属性#
ndarry 对象由 2 部分组成,分别是实际的数据和描述数据的属性,包含以下这些属性。
属性 | 说明 |
---|---|
ndarray.ndim | 秩,即轴的数量或维度的数量 |
ndarray.shape | 数组的维度,n 行 m 列的矩阵 |
ndarray.size | 数组元素的总个数 |
ndarray.dtype | 数据元素的数据类型 |
ndarray.itemsize | 每个元素的大小,以字节为单位 |
例如先生成一个 2 行 3 列的 ndarray 对象,分别查看该 ndarray 对象的各个属性。
a = np.ones((2,3))
a.ndim
a.shape
a.size
a.dtype
a.itemsize
Ndarray 对象数据类型#
由于 ndarray 在底层使用 C 语言实现,因此对象中的每个元素在内存中都有相同存储大小的区域,ndarry 支持的数据类型如下。
数据类型 | 说明 |
---|---|
bool | 布尔型 |
int | 默认的整数类型 |
intc | C 语言的 int 类型 |
intp | 用于索引的整数类型 |
intXX | 整数(XX 表示用 XX 位表示,例如 int16) |
uintXX | 无符号整数(XX 表示用 XX 位表示,例如 uint16) |
floatXX | 半精度浮点数(XX 表示用 XX 位表示,例如 float16) |
complexXX | 复数,表示双 XX 位浮点数 |
Ndarray 对象变换#
维度变换#
可以使用下面的方法变换 ndarray 对象的维度,注意以下方法中有的方法会修改原数组,有的方法则不修改。
方法 | 说明 |
---|---|
np.reshape(shape) | 将数组转换为 shape 形状,原数组不变 |
np.resize(shape) | 将数组转换为 shape 形状,覆盖原数组 |
np.flatten() | 将数组降维为一维数组,原数组不变 |
例如先定义一个 2 行 3 列的数组,然后转换为 3 行 2 列,最后进行降维。
a = np.ones((2,3))
b = a.reshape((3,2))
a.resize((3,2))
b = a.flatten()
类型变换#
可以用 astype() 方法切换 ndarray 对象的数据元素的类型,该方法将生成一个新的 ndarray 对象。例如先生成一个数据元素为 int 类型的 ndarray 对象,然后将数据元素的类型转换为 float。
a = np.ones((2,3),float)
b = a.astype(int)
索引和分片#
一维数组#
若 ndarray 对象为一维数组,则它的分片方式和 list 类型很类似,语法如下。
ndarray[start(:end(:step))]
参数 | 说明 |
---|---|
start | 起始值 |
stop | 终止值 |
step | 步长 |
下面的一维数组分片和索引的简单样例:
a = np.arange(10)
a[2]
a[4:9]
a[2::2]
多维数组#
多维数组的操作其实和一维数组一样,只不过是每一个维度都可以按照一维数组的语法来分片,每个维度之间的索引或分片用逗号(,)隔开。
a = np.arange(18).reshape((3,2,3))
a[1]
a[:,1]
a[:,:,1]
a[:,1,1]
a[1,1]
a[1,1,1]
a[0::2,:,:]
a[0::2,:,1]
a[0::2,1,:]
a[0::2,1,1]
参考资料#
Numpy 官网
NumPy 官方的中文文档
理解numpy中ndarray的内存布局和设计哲学
菜鸟教程——Numpy
中国大学 MOOC——Python数据分析与展示
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)