Python扩展库numpy入门:数组创建、运算与广播机制详解

今天早睡
今天早睡
发布时间:2026-10-12| 7人浏览过
原创

本文详细介绍Python科学计算库numpy的核心概念。内容涵盖ndarray与list的区别、多种数组创建方法(如empty、arange、zeros、ones、diag),演示数组间的加减乘除运算规则,并深入解析广播机制在多维数组计算中的应用,帮助读者掌握numpy基础操作。

一、numpy是什么?

扩展库numpy是Python进行科学计算的核心工具,也是scipy、pandas、sklearn等数据分析与机器学习库的基础依赖。它提供了高效的N维数组对象、复杂的广播函数、C/C++及Fortran代码集成接口,以及线性代数、傅里叶变换和随机数生成等丰富功能。本章重点讲解数组与矩阵及其运算,旨在为后续的数据分析和机器学习学习奠定坚实基础。

简而言之,掌握numpy是构建人工智能应用的基础。常言道“基础不牢,地动山摇”,因此这部分内容至关重要。

建议读者务必认真研读并练习相关示例。

二、numpy数组

在numpy中,我们使用的并非Python原生的list类型,而是专门设计的ndarray对象。

那么,为什么选择使用ndarray而不是直接使用list呢?

主要原因在于底层由C/C++实现,相比Python原生类型,它具有更低的内存占用和更高的执行速度。

创建的方法有多种,此处主要介绍通过array方法将现有数据结构转换的方式。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author: Smly
# @datetime: 2021/9/26 22:22 
# @Version: 1.0

import numpy as np

li = [1, 2, 3]
tp = (1, 2, 3)

nday1 = np.array(li)
nday2 = np.array(tp)

print("*****类型*****")
print(type(nday1))
print(type(nday2))

print("*****数组*****")
print(nday1)
print(nday2)

输出结果:

*****类型*****
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>
*****数组*****
[1 2 3]
[1 2 3]

2.1 数组使用

当数组元素类型一致时,可以直接进行加减乘除运算。

在两个数组元素个数相同的情况下,支持数组之间的逐元素加减运算。

同样地,在元素个数匹配的前提下,支持数组之间的逐元素乘除运算。

若对单个数值进行乘除操作,该操作会自动广播应用到数组的所有元素上。

具体示例如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author: Smly
# @datetime: 2021/9/26 22:22 
# @Version: 1.0
import numpy as np	
li = [1, 2, 3]	# 列表
tp = (1, 2, 3)	# 元组
nday1 = np.array(li)	# 内置方法将列表转为ndarray
nday2 = np.array(tp)	# 内置方法将元组转为ndarray
nday3 = np.array(range(5)) # 使用range内置函数方法生成ndarray连续数组
nday4 = np.array(range(5, 10))  # 使用range内置函数方法生成ndarray连续数组
print("*****类型*****")
print(type(nday1))
print(type(nday2))
print(type(nday3))
print(type(nday4))
print("*****数组*****")
print(nday1)
print(nday2)
print(nday3)
print(nday4)
print("*****数组加减*****")
print(nday2 + nday1)
print(nday2 - nday1)
print(nday4 - nday3)
print(nday3 + nday4)
# 在元素个数相同的情况下,可以进行数组间的加减
print("*****数组乘除*****")
print(nday2 * nday1)
print(nday2 // nday1)
print(nday4 * nday3)
print(nday4 // nday3)
# 在元素个数相同的情况下,可以进行数组间的乘除
print(nday1 * 3)
print(nday2 // 2)
print(nday3 * 2)
print(nday4 // 2)
# 对某个数进行的乘除,可以自动进行到所有元素


运行结果:

*****类型*****
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>
*****数组*****
[1 2 3]
[1 2 3]
[0 1 2 3 4]
[5 6 7 8 9]
*****数组加减*****
[2 4 6]
[0 0 0]
[5 5 5 5 5]
[ 5  7  9 11 13]
*****数组乘除*****
[1 4 9]
[1 1 1]
[ 0  6 14 24 36]
[0 0 0 0 0]
[3 6 9]
[0 1 1]
[0 2 4 6 8]
[2 3 3 4 4]

2.2 创建数组

前文提到的array()方法主要用于将列表或元组等迭代对象转换为数组。

接下来介绍几种自动创建数组的便捷方法。

1. 使用empty创建空数组

该方法创建的数组包含未初始化的随机值,尽管其逻辑初始状态可视为None,但实际内存中可能存在残留数据。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author: Smly
# @datetime: 2021/9/28 12:29 
# @Version: 1.0
import numpy as np
em1 = np.empty(5)       # 创建一个长度为5的空数组
em2 = np.empty((2, 2))  # 创建一个2*2的空二维数组

print("一维数组,长度为5", em1)
print("二维数组,长度为2*2", em2)

输出结果:

[9.96754604e-312 9.96754614e-312 2.60799828e-310 9.34609789e-307
 0.00000000e+000]
[[6.95299778e-310 9.96747617e-312]
 [0.00000000e+000 6.95299776e-310]]

2. 使用arange函数创建

arange是numpy提供的内置函数,功能类似于Python的range,用于生成等差数组。

首先导入numpy包:

import numpy as np

随后创建具体数组。

print("*****ararge创建数组*****")

aran_arr1 = np.arange(5)
aran_arr2 = np.arange(5, 10)

print("*****类型*****")
print(type(aran_arr1))
print(type(aran_arr2))

print("*****数组*****")
print(aran_arr1)
print(aran_arr2)

3. 使用zeros函数生成数组

zeros函数用于生成指定形状的全零数组,支持一维或多维矩阵。

参考以下示例:

分别生成包含三个元素和五个元素的一维数组:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author: Smly
# @datetime: 2021/9/27 21:31 
# @Version: 1.0

import numpy as np
zero_arr = np.zeros(3)
zrro_arr2 = np.zeros(5)
print(zero_arr)
print(zrro_arr2)

运行结果:

[0. 0. 0.] [0. 0. 0. 0. 0.]

除了生成一维数组,还可以创建二维数组,即矩阵形式。

使用如下代码可生成一个三行三列的矩阵:

zero_arr3 = np.zeros((3, 3))

查看输出结果:

print(zero-arr3)

运行结果:

[[0. 0. 0.] [0. 0. 0.] [0. 0. 0.]]

4. ones函数生成数组

使用ones函数可生成全1数组,用法与zeros类似。

import numpy as np

ones_arr1 = np.ones(3)

输出结果:

[1. 1. 1.]

同样可以生成三行三列的全1矩阵:

import numpy as np

ones_arr2 = np.ones((3, 3))

输出结果:

[[1. 1. 1.] [1. 1. 1.] [1. 1. 1.]]

5. diag函数生成对角矩阵

对角矩阵是指非对角线元素均为零,仅在对角线上有值的矩阵。

该函数的参数通常为一个元组,定义对角线上的数值。

结合代码与运行结果可加深理解:

import numpy as np

diag_arr = np.diag((4, 3, 2, 1))

将diag_arr输出的结果为:

[[4 0 0 0] [0 3 0 0] [0 0 2 0] [0 0 0 1]]

可见对角线上的数值正是函数参数中指定的值,至此概念应已清晰。

6. N维数组

N维数组即多维数组,可理解为数组中嵌套数组的结构,例如:

[[[1 2] [3 4]] [[5 6] [7 8]]]

这一概念较为抽象,理解难度稍大。上述示例是一个三维数组,通过三维列表调用array方法转换为对象。

代码实现如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author: Smly
# @datetime: 2021/9/27 13:29 
# @Version: 1.0
import numpy as np

li = [
    [[1, 2], [3, 4]],
    [[5, 6], [7, 8]]
]
te1 = np.array(li)
print(te1)

需要注意的是,二维数组也属于N维数组的特例。

2.3 访问数组元素

numpy提供了insert函数,用于向数组中插入新元素。

具体实例如下:

li = [[1, 2, 3, 4], [5, 6, 7, 8], [2, 4, 6, 8]]
gb1 = np.array(li)
np.insert(gb1, 1, [1, 2, 3, 4])

输出结果:

[1 1 2 3 4 2 3 4 5 6 7 8 2 4 6 8]

此外,numpy还内置了add等函数,支持数组间的加减运算。

作为数组,可以通过下标索引获取特定元素。

import numpy as np

li1 = [1, 2, 3, 4]
gb2 = np.array(li1)
print(gb2[1])

输出结果为:

2

由于数组支持迭代,自然也可以使用循环语句遍历所有元素。

三、了解矩阵

数组与矩阵在概念上有所区别。

数组是一种数据结构,可存储多种数据类型,并支持多维结构。

矩阵则是数学概念,通常仅存放数字,且严格限定为二维形式。

生成矩阵的方法与创建N维数组基本一致。

通常先使用列表构建二维列表,再通过numpy方法转换为矩阵。当然,也存在其他直接生成矩阵的途径。

import numpy as np
li = [[1, 2, 3, 4], [5, 6, 7, 8]]
j1 = np.matrix(li)
print(j1)
print(type(j1))
print(j1.dtype)

输出该矩阵:

输出矩阵: [[1 2 3 4]
 [5 6 7 8]]
矩阵在Python的类型: <class 'numpy.matrix'>
在numpy中的类型: int32

矩阵支持各类数学运算,numpy均提供了良好支持,此处不再赘述。

3.1 广播

“广播”(Broadcasting)原指网络中将信息发送至局域网内所有计算机的概念。

在numpy中,广播指将标量或低维数组自动扩展以匹配高维数组形状的过程。例如,数组与单个数值相乘时,该数值会自动应用于所有元素。

import numpy as np

li1 = [1, 2, 3, 4]
print(np.array(li1)*10)

输出结果:

[10 20 30 40]

这就是广播机制:将数字10广播至由li转换的数组中,使所有元素均乘以10。

不同维度的数组之间同样适用广播规则。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author: Smly
# @datetime: 2021/9/27 13:40 
# @Version: 1.0
import numpy as np
li = [[1, 2, 3, 4], [5, 6, 7, 8], [2, 4, 6, 8]]
gb1 = np.array(li)
li1 = [1, 2, 3, 4]
gb2 = np.array(li1)
print(gb1*gb2)

将一维数组的每个元素依次广播到二维数组时,需满足特定条件:

二维数组中一维子数组的数量必须与一维数组的元素数量相同。

运行结果:

[[ 1 4 9 16] [ 5 12 21 32] [ 2 8 18 32]]

以上为python扩展库numpy入门教程的详细内容,更多关于numpy库入门的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。