Python Numpy 库:Ndarray 对象

本文仅介绍 ndarray 对象的基本操作,更多数学运算功能可以查阅说明文档或其他教程使用。

Numpy#

NumPy(Numerical Python) 是 Python 的一个开源数值计算扩展库,可以用于大量的维度数组与矩阵的存储于运算,同时对数组运算提供大量的数学函数。相比 Python 本身提供的列表实现的多位数据结构,Numpy 提供的结构的预算将比嵌套列表效率更高,而且更节省资源。同时 Numpy 库也经常搭配很多数据处理或科学计算库使用,可以进入 Numpy 的官网NumPy 官方中文文档做进一步了解。

NumPy 主要包含的组件和功能有:

  1. N 维数组对象 Ndarray
  2. 广播功能函数
  3. 整合 C/C++/Fortran 代码的工具
  4. 线性代数、傅里叶变换、随机数生成等功能

NumPy 安装并使用#

安装#

在 cmd 命令下输入命令,等待安装完成即可。

Copy Highlighter-hljs
pip install numpy

Anaconda 环境下配置就很简单了,找到 Numpy 库勾上就行,默认是启用的。

使用#

想要使用 Numpy 库,就需要把 Numpy 库包含进来,代码如下。一般为了简化 Numpy 库的调用,约定俗成把 Numpy 简化为 np。

Copy Highlighter-hljs
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) 的矩阵:

Copy Highlighter-hljs
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)的数组。

Copy Highlighter-hljs
a = np.arange(n, dtype = int)


如下代码将生成 5 行 5 列的单位矩阵。

Copy Highlighter-hljs
a = np.eye(5)

生成数列#

ndarray 对象可以以一维数组的方式生成一些数列,常用生成数列的方法有 2 个。

Copy Highlighter-hljs
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 行代码分别是用终值生成数列、加上初始值和步长生成数列。

Copy Highlighter-hljs
a = np.arange(7) a = np.arange(5, 25, 5)


linspace 方法的参数说明如下:

参数 说明
start 起始值(默认为 0)
stop 终止值
num 生成的等步长的样本数量,默认为 50
endpoint 该值为 true 时数列中包含 stop 值,反之不包含
dtype 数组元素的数据类型

例如生成初值为 2,终值为 10 且包含 5 个样本的数列代码为:

Copy Highlighter-hljs
a = np.linspace(2, 10, 5)

这句代码的效果如下:

基于现有结构#

ndarray 对象可以从现有的结构转换,例如用列表和元素进行转换,使用的方法如下。

Copy Highlighter-hljs
np.array(list/tuple, dtype)

例如先定义一个列表,然后用这个列表生成 ndarray 对象。

Copy Highlighter-hljs
alist = [1, 2, 3, 4, 5] a = np.array(alist)

array 方法的效果如下。

顺带一提 tolist() 方法可以把 ndarray 对象转换为列表,例如如下代码:

Copy Highlighter-hljs
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 的数组。

Copy Highlighter-hljs
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 对象的各个属性。

Copy Highlighter-hljs
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 列,最后进行降维。

Copy Highlighter-hljs
a = np.ones((2,3)) b = a.reshape((3,2)) a.resize((3,2)) b = a.flatten()

这些方法的效果如下:

类型变换#

可以用 astype() 方法切换 ndarray 对象的数据元素的类型,该方法将生成一个新的 ndarray 对象。例如先生成一个数据元素为 int 类型的 ndarray 对象,然后将数据元素的类型转换为 float。

Copy Highlighter-hljs
a = np.ones((2,3),float) b = a.astype(int)

该方法的效果如下:

索引和分片#

一维数组#

若 ndarray 对象为一维数组,则它的分片方式和 list 类型很类似,语法如下。

Copy Highlighter-hljs
ndarray[start(:end(:step))]
参数 说明
start 起始值
stop 终止值
step 步长

下面的一维数组分片和索引的简单样例:

Copy Highlighter-hljs
a = np.arange(10) a[2] a[4:9] a[2::2]

多维数组#

多维数组的操作其实和一维数组一样,只不过是每一个维度都可以按照一维数组的语法来分片,每个维度之间的索引或分片用逗号(,)隔开。

Copy Highlighter-hljs
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数据分析与展示

posted @   乌漆WhiteMoon  阅读(647)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示
CONTENTS