一、Numpy概述
NumPy(Numerical Python)是一个用于Python编程语言的开源库,主要用于科学计算和数据分析,可以快速处理任意维度的数组。它提供了一个强大的N维数组对象(ndarray)和多种用于数组操作的工具,成为许多其他科学计算库(如SciPy、Pandas、Matplotlib等)的基础。
二、Numpy的主要特性
1.N维数组对象
Numpy的核心是ndarray对象,它是一个多维数组,能够高效存储和处理大量数据。ndarray支持各种数据类型,包括整数、浮点数和复数等。
2.高效的数组运算
Numpy支持向量化运算,可以对整个数组进行操作,而不需要使用循环,这使得 运算速度显著提高。
3.广播功能
Numpy的广播机制允许不同形状的数组进行数学运算,使得数组操作更加灵活。
4.数学函数库
Numpy提供了丰富的数学函数,包括线性代数、傅里叶变换、随机数生成等,方便用户进行各种科学计算。
5.数学处理工具
Numpy支持数组的切片、索引和变形操作,用户可以方便地对数据进行处理和分析。
6.与其他库的兼容性
Numpy与其他科学计算库(如Pandas、Scipy、Matplotlib)等无缝集成,用户可以轻松地进行数据分析和可视化。
三、Numpy的安装
在终端里面使用pip轻松安装。
pip install numpy
针对不同的Python版本,可以安装相对应的Numpy版本。
Numpy版本 | Python版本 |
---|---|
1.24.x | 3.8 - 3.11 |
1.23.x | 3.7 - 3.10 |
1.22.x | 3.7 - 3.10 |
1.21.x | 3.6 - 3.9 |
1.20.x | 3.6 - 3.8 |
1.19.x | 3.5 - 3.8 |
1.18.x | 3.5 - 3.7 |
1.17.x | 3.5 - 3.7 |
四、Numpy的语法
1.Array数组:
# 导入Numpy包,并命名为np
import numpy as np
# 定义列表
wang_list = [1,2,3,4,5]
# 转换成array数组
wang_array = np.array(wang_list)
# 查看数组的类型
wang_array.dtype # 输出:int32
# 每个元素的字节大小
wang_array.itemsize # 输出:4,因为int32占用4字节
# 查看数组的结构
wang_array.shape # 输出:(5,)
# 查看元素个数
wang_array.size # 输出:5
# 数组的维度数量(即数组的“阶数”或“维数”)
wang_array.ndim
# 索引与切片
wang_array[0] # 输出:1。因为是输出的第一个数字
wang_array[1:3] # 输出:[2,3]。输出的是第二个和第三个数字,左闭右开。
wang_array[-2:] # 输出:[4,5]。输出的倒数第二个到最后一个数字。
2.数组结构:
# 导入Numpy包,并命名为np
import numpy as np
# 构建二维矩阵
wang_array = np.array([[1,2,3],[4,5,6],[7,8,9]])
# 复制数组
wang_array2 = wang_array.copy()
# 构建bool类型的数组
mask = np.array([0,0,0,1,1,1], dtype = bool)
3.数值运算:
# 导入Numpy包,命名为np
import numpy as np
# 构建一个二维数组
wang_array = np.array([[1,2,3],[4,5,6]])
# 里面所以元素的和
wang_array.sum(wang_array) # 输出:21
# 指定要进行的操作是沿什么轴(维度)
wang_array.sum(wang_array, axis = 0) # 输出:[5,7,9],对每一列进行求和
wang_array.sum(wang_array, axis = 1) # 输出:[6,15],对每一行进行求和
# 计算所有元素的乘积
wang_array.prod() # 输出:720
wang_array.prod(wang_array, axis = 0) # 输出:[4,10,18],对每一列进行求积
wang_array.prod(wang_array, axis = 1) # 输出:[6,120],对每一行进行求积
# 查看所有元素里面的最小值
wang_array.min() # 输出:1
wang_array.min(wang_array, axis = 0) # 输出:[1,2,3],求每一列的最小值
wang_array.min(wang_array, axis = 1) # 输出:[1,4],求每一行的最小值
# 查看所有元素里面的最大值
wang_array.max() # 输出:6
# 求最大值的索引值
wang_array.argmax() # 输出:5
注意:求索引值只要在函数前面加一个“arg”
# 求数组元素的平均值
wang_array.mean() # 输出:3.5
# 求数组元素的标准差
wang_array.std() # 输出:1.707825127659933
# 求数组元素的方差
wang_array.var() # 输出:2.9166666666666665
# 对数组的值做一个限制
# 小于2的值全部变成2, 大于4的值全部变成4
wang_array.clip(2,4) # 输出:[[2,2,3],[4,4,4]]
# 四舍五入
wang_array.round()
# 保留精度为1,保留一位小数
wang_array.round(decimals = 1)
4.排序操作:
# 导入Numpy包,命名为np
import numpy as np
# 构建一个小数二维数组
wang_array = np.array([[1.5,1.3,7.5],[5.6,7.8,1.2]])
# 把数组里面所有元素进行排序
np.sort(wang_array) # 输出:[[1.3,1.5,7.5],[1.2,5.6,7.8]]
# 排序后元素位置的索引值
np.argsort(wang_array) # 输出:[[1,0,2],[2,0,1]]
# 在0-10之间按平均差异构造10个数
wang_array = np.linspace(0,10,10) # 输出:[0.,1.11111111,2.22222222,3.33333333,
4.44444444.5.55555556,6.66666667,7.77777778,
8.88888889,10. ]
# 构建一个数组values
values = np.array([2.5,6.5,9.5])
# 在wang_array中查找values元素的插入位置,返回一个索引数组,指示在数组中应该插入给定值的位置。
np.searchsorted(wang_array,values) # 输出:[3,6,9]
# 创建一个二维数组 wang_array,它的形状是 (4, 3),包含四行三列。
wang_array = np.array([1,0,6],
[1,7,0],
[2,3,1],
[2,4,0]])
# 第一列降序排序,第三列的值升序排序,返回索引值
index = np.lexsort([-1*wang_array[:,0],wang_array[:,2]]) # 输出:[0,1,3,2]
# 按照指定的排序规则进行排序
wang_array = wang_array[index] # 输出:[[2,4,0],
[1,7,0],
[2,3,1],
[1,0,6]]
5.数组生成函数
# 构造一个数组
np.arange(10) # 输出:[0,1,2,3,4,5,6,7,8,9]
np.arange(2,20,2) # 输出:[2,4,6,8,10,12,14,16,18]
np.arange(2,20,2, dtype=np.float32) # 输出:[2.,4.,6.,8.,10.,12.,14.,16.,18.]
# 构造一个包含 10 个数字的数组,这些数字在 0 和 10 之间均匀分布
np.linspace(0,10,10) # 输出:[0,1.11111111,2.22222222,3.33333333,
4.44444444,5.55555556,6.66666667,7.77777778,
8.88888889,10.]
# 构建一个包含5个数字的数组,在 1 到 10 之间对数均匀分布,默认是以10为底的
np.logspace(0,1,5) # 输出:[1.,1.77827941,3.16227766,5.62341325,10.]
6.四则运算
import numpy as np
x = np.array([5,5])
y = np.array([2,2])
# 对x,y两个数组进行逐元素相乘
np.multiply(x,y) # 输出:[10,10]
# 计算的是两个向量的点积。点积的计算方式是将对应元素相乘后求和
np.dot(x,y) # 输出:20 = 5*2 + 5*2
x = np.array([1,1,1])
y = np.array([1,1,1])
# 比较两个数组的元素是否相等,要求两个数组的元素个数相等
x == y # 输出:[True,True,True]
# 逻辑与运算
np.logical_and(x,y) # 用于对两个布尔数组进行逐元素的逻辑与运算,返回一个新的布尔数组
# 或
np.logical_or(x,y) # 输出:[True,True,True]
# 非
np.logical_not(x,y) # 输出:[0,0,0]
7.随机模块
# 生成一个形状为 (3, 2) 的数组,其中的元素是从均匀分布(范围在 [0, 1))中随机生成的浮点数
np.random.rand(3,2) # 输出:[[0.9866333,0.09269885],
[0.70162927,0.12834428],
[0.02000093,0.16113582]]
# 生成一个形状为 (5, 4) 的数组,其中的元素是从 0 到 9(包含 0,不包含 10)之间的随机整数
np.random.randint(10, size = (5,4)) # 输出:[[2 3 7 1]
[5 0 4 8]
[9 6 1 3]
[0 2 5 7]
[8 4 2 6]]
# 0-10之间随机生成三个整数
np.random.randint(0,10,3) # 输出:[2,3,5]
# 随机种子
# 种子是一个整数,用于初始化随机数生成器,以确保每次运行代码时生成的随机数序列都是相同的。
np.random.seed(100)
8.文件读写
# 导入 NumPy 库,通常用作 np 的别名
import numpy as np
# 使用 Jupyter Notebook 的魔法命令 %%writefile 将以下文本写入名为 tang.txt 的文件。
# 文件内容是两行数字,数字之间用空格分隔。
%%writefile tang.txt
1 2 3 4 5 6
2 3 5 8 7 9
# 初始化一个空列表 data 用于存储读取的数据。
data = []
# 打开 tang.txt 文件,并将其赋值给变量 f。
with open('tang.txt') as f:
# 逐行读取文件内容。
for line in f.readlines():
# 将每一行的字符串按空格分割成列表 fileds
fileds = line.split()
# 将分割出的字符串转换为浮点数,并存储在 cur_data 列表中。
cur_data = [float(x) for x in fileds]
# 将当前行的数据添加到 data 列表中。
data.append(cur_data)
# 将列表 data 转换为 NumPy 数组。
data = np.array(data)
# 使用 np.loadtxt 函数直接从 tang.txt 文件中读取数据并将其转换为 NumPy 数组。
# 此方法自动处理文件的分隔符(默认为空格)。
data = np.loadtxt('tang.txt')
# 使用 %%writefile 将以下文本写入名为 tang2.txt 的文件。
# 文件内容是两行数字,数字之间用逗号分隔。
%%writefile tang2.txt
1,2,3,4,5,6
2,3,5,8,7,9
# 使用 np.loadtxt 从 tang2.txt 文件中读取数据,
# 指定 delimiter=',' 表示数据是用逗号分隔的。
# 读取的数据将被存储为 NumPy 数组。
data = np.loadtxt('tang2.txt',delimiter = ',')
# 再次使用 %%writefile 将新的内容写入 tang2.txt 文件。
# 现在文件的第一行是列名,后面是数据。
%%writefile tang2.txt
x,y,z,w,a,b
1,2,3,4,5,6
2,3,5,8,7,9
# 使用 np.loadtxt 从 tang2.txt 中读取数据,
# 指定 delimiter=',' 表示用逗号分隔,
# 同时使用 skiprows=1 跳过第一行(列名),只读取数据部分。
data = np.loadtxt('tang2.txt',delimiter = ',',skiprows = 1)
注意: 'tang2.txt':路径最好放到和代码一起
skiprows : 去掉几行
delimiter = ',' :分隔符
usecols = (0,1,4) :指定使用哪几列
# 创建一个名为 tang_array 的 NumPy 数组,包含两行三列的整数。
tang_array = np.array([[1,2,3],[4,5,6]])
# 将 tang_array 数组保存到名为 tang4.txt 的文件中,
# 使用默认的分隔符(空格)
np.savetxt('tang4.txt',tang_array)
# 将 tang_array 数组保存到 tang4.txt 文件中,
# 使用格式化字符串 fmt='%d' 指定保存为整数格式。
np.savetxt('tang4.txt',tang_array,fmt='%d')
# 将 tang_array 数组保存到 tang4.txt 文件中,
# 使用格式化字符串 fmt='%d' 指定保存为整数格式,并使用逗号作为分隔符。
np.savetxt('tang4.txt',tang_array,fmt='%d',delimiter = ',')
# 将 tang_array 数组保存到 tang4.txt 文件中,
# 使用格式化字符串 fmt='%.2f' 指定保存为浮点数格式(保留两位小数),并使用逗号作为分隔符。
np.savetxt('tang4.txt',tang_array,fmt='%.2f',delimiter = ',')
9.数组保存
# 创建一个二维数组并保存为 .npy 文件
tang_array = np.array([[1,2,3],[4,5,6]])
np.save('tang_array.npy',tang_array)
# 加载之前保存的 .npy 文件
tang = np.load('tang_array.npy')
# 创建一个一维数组 tang_array2,该数组包含从 0 到 9 的整数(总共 10 个元素)。
tang_array2 = np.arange(10)
# 将 tang_array 和 tang_array2 保存为一个压缩的 .npz 文件,
# 文件名为 'tang.npz'
# tang_array 被命名为 'a',tang_array2 被命名为 'b'。
np.savez('tang.npz',a=tang_array,b=tang_array2)
# 加载之前保存的 .npz 文件,并将其内容赋值给变量 data
data = np.load('tang.npz')
# 查看 .npz 文件中的键
data.keys()
# 访问保存的数组 a
data['a']
# 访问保存的数组 b
data['b']
五、课后练习题
- 打印当前Numpy版本
- 构造一个全零的矩阵,并打印其占用的内存大小
- 打印一个函数的帮助文档,比如numpy.add
- 创建一个10-49的数组,并将其倒序排列
- 找到一个数组中不为0的索引
- 随机构造一个3*3矩阵,并打印其中最大与最小值
- 构造一个5*5的矩阵,令其值都为1,并在最外层加上一圈0
- 构建一个shape为(6,7,8)的矩阵,并找到第100个元素的索引值
- 对一个5*5的矩阵做归一化操作
- 找到两个数组中相同的值
- 得到今天 明天 昨天的日期
- 得到一个月中所有的天
- 得到一个数的整数部分
- 构造一个数组,让它不能被改变
- 打印大数据的部分值,全部值
- 找到在一个数组中,最接近一个数的索引
- 32位float类型和32位int类型转换
- 打印数组元素位置坐标与数值
- 按照数组的某一列进行排序
- 统计数组中每个数值出现的次数
- 如何对一个四维数组的最后两维来求和
- 交换矩阵中的两行
- 找到一个数组中最常出现的数字
- 快速查找TOP K
- 去除掉一个数组中,所有元素都相同的数据