Python扩展库numpy入门:数组创建、运算与广播机制详解
本文详细介绍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库入门的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









