想要查看本系列的其他文章请到作者主页中。
学习提示:在有别的编程基础之上,学习Python很简单,只是语法不同,所以有很多新的语法记不住也没关系,不用专门耗时间死记,实战的时候现用现查就行。
下面的介绍中是每个部分最常用的语法,基本能够应付绝大多数的情况,如果希望学习更详细的内容,可以参考每个部分给出的资料链接。
AI闪电战:代码+实战 从Python速通到深度学习|数据处理与分析——NumPy库
1. 数组的创建与基本操作
NumPy 是 Python 进行科学计算最常用的库之一,尤其在处理数组和矩阵时效率极高。掌握 NumPy 的数组操作是学习机器学习的基础,下面我们将快速了解如何创建和操作数组。
1.1 创建一维数组和多维数组
引入:
数组是 NumPy 中的核心对象,它类似于 Python 的列表,但能进行更高效的数学运算。NumPy 提供了多种方式来创建不同维度的数组,一维数组常用来表示向量,多维数组可用于表示矩阵或张量。
常用语法:
import numpy as np
# 创建一维数组
arr_1d = np.array([1, 2, 3, 4, 5])
# 创建二维数组
arr_2d = np.array([[1, 2, 3], [4, 5, 6]])
# 创建三维数组
arr_3d = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
要点总结:
- 一维数组可以看作是向量,二维数组是矩阵,三维及以上为多维数组。
np.array()
是最基本的创建数组方法,传入嵌套列表即可创建多维数组。
练习:
创建一个二维数组,包含两行三列的元素。
答案:
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr)
1.2 使用arange, linspace, zeros, ones, empty等函数创建数组
引入:
NumPy 提供了多个方便的函数用于生成数组,这些函数可以根据需求创建特定形状和值的数组,如等差数列、全零数组或全一数组等。
常用语法:
# arange: 创建等差数组
arr_arange = np.arange(0, 10, 2) # [0, 2, 4, 6, 8]
# linspace: 创建等间距的数组
arr_linspace = np.linspace(0, 1, 5) # [0. , 0.25, 0.5 , 0.75, 1. ]
# zeros: 创建全零数组
arr_zeros = np.zeros((2, 3)) # 2行3列全零矩阵
# ones: 创建全一数组
arr_ones = np.ones((2, 3)) # 2行3列全一矩阵
# empty: 创建未初始化的数组(值不确定)
arr_empty = np.empty((2, 3))
要点总结:
np.arange()
用于生成等差序列,np.linspace()
用于生成等间距序列。np.zeros()
和np.ones()
可以生成指定形状的全零、全一矩阵,np.empty()
则创建未初始化的矩阵。
练习:
使用 np.arange()
创建一个从 0 到 10,每隔 2 个数的数组。
答案:
arr = np.arange(0, 10, 2)
print(arr)
1.3 查看数组属性(如shape, dtype, size)
引入:
当你创建一个数组后,往往需要查看数组的基本信息,如形状(shape)、元素类型(dtype)和数组大小(size)等。这些信息可以帮助我们快速了解数据的结构。
常用语法:
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 查看数组形状
print(arr.shape) # (2, 3)
# 查看数据类型
print(arr.dtype) # int64(或其他平台相关类型)
# 查看数组元素总数
print(arr.size) # 6
要点总结:
shape
返回数组的维度,例如(2, 3)
表示2行3列。dtype
表示数组中元素的数据类型。size
返回数组中总的元素数量。
练习:
创建一个三维数组,并查看它的形状和总元素个数。
答案:
arr = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(arr.shape) # (2, 2, 2)
print(arr.size) # 8
要点总结:
- NumPy 提供了多种方式创建数组,包括
array
、arange
、linspace
、zeros
、ones
等。 - 创建数组后,常用属性如
shape
、dtype
和size
可以帮助你快速了解数组的维度、数据类型和大小。 - 学习数组的创建和基本操作是数据处理和分析的基础,它为后续的机器学习建模打下坚实的基础。
进一步学习:
如果你想更深入地了解 NumPy 数组的创建与操作,可以参考官方文档:NumPy User Guide
好的,以下是关于**“数组的索引和切片”**部分的详细内容,包括引入、常用语法、要点总结、练习与答案及详细学习链接。此部分聚焦在如何访问和操作 NumPy 数组中的元素,这是进行数据处理和分析的重要基础。
2. 数组的索引和切片
在数据分析和机器学习中,我们经常需要访问和操作数组中的特定元素。NumPy 提供了非常强大的索引和切片功能,不仅支持传统的数组索引,还支持高级索引如布尔索引和花式索引。这部分将为你讲解如何高效操作 NumPy 数组中的数据。
2.1 基本索引和切片
引入:
基本索引和切片是访问 NumPy 数组中特定元素或子数组的最常用方式。你可以像操作 Python 列表一样,通过索引访问数组的元素,还可以通过切片提取子数组。
常用语法:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 索引:访问特定元素
print(arr[0, 2]) # 输出 3,访问第1行第3个元素
# 切片:提取子数组
print(arr[1:, :2]) # 输出 [[4, 5], [7, 8]],提取第2行和第3行的前两列
要点总结:
- NumPy 索引从 0 开始,类似 Python 列表。
- 通过逗号
,
分隔行和列的索引来访问多维数组中的元素。 - 切片语法
start:stop:step
可以提取子数组。
练习:
从下面的二维数组中提取第2行的前两列。
答案:
arr = np.array([[10, 20, 30], [40, 50, 60], [70, 80, 90]])
print(arr[1, :2]) # 输出 [40, 50]
2.2 高级索引(布尔索引,整数数组索引)
引入:
高级索引允许你根据条件或特定索引列表来选取数组中的元素。这种方式不仅更加灵活,还能用于复杂的数据操作。
常用语法:
- 布尔索引:根据条件选择符合要求的元素。
- 整数数组索引:使用整数数组指定要提取的元素。
arr = np.array([10, 20, 30, 40, 50])
# 布尔索引
print(arr[arr > 30]) # 输出 [40, 50],选取大于30的元素
# 整数数组索引
print(arr[[0, 2, 4]]) # 输出 [10, 30, 50],选取第0、2、4个元素
要点总结:
- 布尔索引允许你根据条件筛选数组中的元素。
- 整数数组索引可以用于从数组中选取多个特定位置的元素。
练习:
从数组 [5, 10, 15, 20, 25, 30]
中选取大于 15
的元素。
答案:
arr = np.array([5, 10, 15, 20, 25, 30])
print(arr[arr > 15]) # 输出 [20, 25, 30]
2.3 花式索引
引入:
花式索引可以使用数组或列表来索引多维数组的特定位置,它能让你一次性选取数组中的多个不连续的元素,非常灵活且高效。
常用语法:
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 花式索引:选取特定行列的元素
print(arr[[0, 2], [1, 2]]) # 输出 [2, 9],选取(0,1)和(2,2)位置的元素
要点总结:
- 花式索引允许你使用数组指定要选取的多个元素位置,适用于复杂的数据提取操作。
- 索引的每个维度可以使用一个列表或数组指定要提取的元素。
练习:
使用花式索引从数组 [[1, 2], [3, 4], [5, 6]]
中选取 1, 4, 6
这三个元素。
答案:
arr = np.array([[1, 2], [3, 4], [5, 6]])
print(arr[[0, 1, 2], [0, 1, 1]]) # 输出 [1, 4, 6]
要点总结:
- 基本索引和切片 用于访问和提取数组的子集,常用语法与 Python 列表相似。
- 布尔索引 可以根据条件选取数组中的元素,整数数组索引 则可以通过数组或列表选择特定位置的元素。
- 花式索引 是一种非常灵活的索引方式,允许同时选择多个不连续的数组元素。
- 索引和切片是 NumPy 高效处理大规模数据的核心技术,熟练掌握这些技术对后续的机器学习数据操作至关重要。
进一步学习:
你可以通过阅读官方文档了解更多关于 NumPy 索引和切片的详细内容:NumPy Indexing
好的,下面是关于 “数组的运算和函数应用” 部分的详细内容。这一部分将重点介绍如何在 NumPy 中进行数组的元素级运算、广播机制及常用数学函数的应用。这些内容是处理和操作数值型数据的重要基础。
3. 数组的运算和函数应用
NumPy 提供了丰富的数组运算功能,使得数据分析和处理更加简便。通过 NumPy,可以对数组中的元素进行算术运算、应用各种数学函数,并利用广播机制高效处理不同维度的数组操作。
3.1 元素级算术运算
引入:
在 NumPy 中,数组支持元素级的算术运算,例如加、减、乘、除等操作。这些运算可以直接应用于整个数组,效率非常高,不需要像 Python 列表那样使用循环逐个处理元素。
常用语法:
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
# 元素级加法
print(arr1 + arr2) # 输出 [5, 7, 9]
# 元素级乘法
print(arr1 * arr2) # 输出 [4, 10, 18]
# 标量乘法
print(arr1 * 2) # 输出 [2, 4, 6]
要点总结:
- NumPy 数组的算术运算是元素级别的,即相同位置的元素进行运算。
- 你可以对数组执行加法、减法、乘法、除法等运算,或者进行标量与数组的运算。
- NumPy 的算术运算不需要显式的循环,速度更快,代码更简洁。
练习:
计算数组 [1, 2, 3]
和 [7, 8, 9]
的元素级加法与乘法。
答案:
arr1 = np.array([1, 2, 3])
arr2 = np.array([7, 8, 9])
print(arr1 + arr2) # 输出 [8, 10, 12]
print(arr1 * arr2) # 输出 [7, 16, 27]
3.2 广播机制
引入:
NumPy 中的广播机制使得不同维度的数组之间能够进行运算。广播可以自动扩展较小的数组,使其与较大的数组兼容,从而高效执行运算。
常用语法:
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 广播标量到整个数组
print(arr + 10) # 输出 [[11, 12, 13], [14, 15, 16]]
# 广播一维数组到二维数组
arr1 = np.array([1, 2, 3])
print(arr + arr1) # 输出 [[2, 4, 6], [5, 7, 9]]
要点总结:
- 广播机制能够自动匹配不同形状的数组,使它们能够进行运算。
- 小维度数组会扩展(广播)以匹配大维度数组,但必须满足一定的广播规则(如行或列相同)。
- 广播提高了数组操作的灵活性,减少了手动对齐数据的繁琐操作。
练习:
对数组 [[10, 20, 30], [40, 50, 60]]
加上 [1, 2, 3]
,并观察结果。
答案:
arr = np.array([[10, 20, 30], [40, 50, 60]])
arr1 = np.array([1, 2, 3])
print(arr + arr1) # 输出 [[11, 22, 33], [41, 52, 63]]
3.3 常用数学函数(如sin, cos, exp, log等)
引入:
NumPy 提供了许多常见的数学函数,例如三角函数、指数函数和对数函数等。这些函数可以直接作用于数组的每一个元素,返回一个新的数组。
常用语法:
arr = np.array([0, np.pi / 2, np.pi])
# 计算 sin 函数
print(np.sin(arr)) # 输出 [0. 1. 0.]
# 计算 exp 函数
print(np.exp(arr)) # 输出 [1. 4.81047738 23.14069263]
# 计算 log 函数
arr = np.array([1, np.e, np.e**2])
print(np.log(arr)) # 输出 [0. 1. 2.]
要点总结:
- NumPy 提供了大量常用的数学函数,如
sin
、cos
、exp
、log
等,能够高效计算数组中每个元素的结果。 - 数学函数的调用方式与 Python 标准库类似,但 NumPy 函数可以直接作用于整个数组。
练习:
计算数组 [0, π/4, π/2]
的 sin 值,以及数组 [1, 2, 3]
的 exp 值。
答案:
arr1 = np.array([0, np.pi / 4, np.pi / 2])
print(np.sin(arr1)) # 输出 [0. 0.70710678 1.]
arr2 = np.array([1, 2, 3])
print(np.exp(arr2)) # 输出 [ 2.71828183 7.3890561 20.08553692]
3.4 统计函数(如mean, median, std, var等)
引入:
统计函数是数据分析的常用工具,它们可以快速计算数组的统计量,如均值、方差、标准差等。
常用语法:
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 计算均值
print(np.mean(arr)) # 输出 3.5
# 计算中位数
print(np.median(arr)) # 输出 3.5
# 计算标准差
print(np.std(arr)) # 输出 1.707825127659933
# 计算方差
print(np.var(arr)) # 输出 2.9166666666666665
要点总结:
mean()
计算均值,median()
计算中位数,std()
计算标准差,var()
计算方差。- 这些统计函数可以帮助你快速了解数据的分布和集中趋势。
- 你可以通过
axis
参数指定按行或列计算统计量。
练习:
计算数组 [[7, 8], [9, 10]]
的均值和标准差。
答案:
arr = np.array([[7, 8], [9, 10]])
print(np.mean(arr)) # 输出 8.5
print(np.std(arr)) # 输出 1.118033988749895
要点总结:
- 元素级运算:NumPy 支持直接对数组元素进行加、减、乘、除等运算,且无需显式循环。
- 广播机制:可以处理不同维度的数组运算,使得小维度数组能自动扩展以匹配大维度数组。
- 常用数学函数:NumPy 提供了大量数学函数,能够直接作用于数组。
- 统计函数:均值、方差、标准差等统计量可以帮助你快速分析数据特征。
进一步学习:
如果你想更深入地学习 NumPy 的运算和函数应用,可以参考官方文档:NumPy Routines
4. 高效数组操作
在实际数据分析和机器学习中,快速处理和操作数据是关键。NumPy 提供了一些高效的函数,可以简化这些操作,如条件选择、查找唯一值、排序、数组合并和分割等。通过这些功能,数据处理可以更加简便和高效。
4.1 使用 np.where 进行条件选择
引入:
np.where
是一个强大的工具,允许你根据条件选择数组中的元素。这类似于 SQL 中的 CASE WHEN
操作,适用于数据筛选和替换等场景。
常用语法:
import numpy as np
arr = np.array([10, 20, 30, 40])
# 条件选择:将大于20的值设为1,其他值设为0
result = np.where(arr > 20, 1, 0)
print(result) # 输出 [0 0 1 1]
要点总结:
np.where(condition, x, y)
根据条件condition
,返回满足条件的元素为x
,否则为y
。- 适用于根据条件对数组进行筛选或替换操作。
- 可以用于创建新的数组,或对原数组的元素进行有条件的修改。
练习:
将数组 [5, 15, 25, 35]
中大于 20 的值替换为 99,其他值保持不变。
答案:
arr = np.array([5, 15, 25, 35])
result = np.where(arr > 20, 99, arr)
print(result) # 输出 [ 5 15 99 99]
4.2 使用 np.unique 找出数组中的唯一值
引入:
在数据处理中,查找数组中的唯一值是常见操作,例如去重处理或查找分类标签的种类。NumPy 提供了 np.unique
函数,可以快速找到数组中的唯一值。
常用语法:
arr = np.array([1, 2, 2, 3, 3, 3, 4])
# 查找唯一值
unique_values = np.unique(arr)
print(unique_values) # 输出 [1 2 3 4]
要点总结:
np.unique()
返回数组中的唯一值,适用于去重或分类操作。- 该函数还可以返回唯一值的出现次数,或它们在原数组中的位置(通过参数
return_counts
和return_index
)。
练习:
找出数组 [4, 4, 6, 6, 6, 8, 8, 10]
中的唯一值。
答案:
arr = np.array([4, 4, 6, 6, 6, 8, 8, 10])
unique_values = np.unique(arr)
print(unique_values) # 输出 [ 4 6 8 10]
4.3 使用 np.sort 对数组排序
引入:
数据排序是一个常见的需求,尤其是在数据分析和机器学习中,排序可以帮助我们理解数据的分布或为后续操作做准备。np.sort
可以对数组进行排序,支持按行或列排序。
常用语法:
arr = np.array([3, 1, 4, 1, 5, 9])
# 对数组进行排序
sorted_arr = np.sort(arr)
print(sorted_arr) # 输出 [1 1 3 4 5 9]
要点总结:
np.sort()
用于对数组进行升序排序,默认对整个数组排序,也可以指定按行或按列排序。- 该函数不会改变原数组,而是返回一个新数组。如果需要在原地排序,可以使用
arr.sort()
。
练习:
对数组 [8, 3, 7, 1, 2, 9, 5]
进行升序排序。
答案:
arr = np.array([8, 3, 7, 1, 2, 9, 5])
sorted_arr = np.sort(arr)
print(sorted_arr) # 输出 [1 2 3 5 7 8 9]
4.4 合并数组(使用 np.concatenate, np.vstack, np.hstack 等)
引入:
有时我们需要将多个数组合并成一个整体,NumPy 提供了多个函数来实现这一操作,主要包括 np.concatenate
(沿指定轴拼接)、np.vstack
(垂直拼接)和 np.hstack
(水平拼接)。
常用语法:
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
# 沿一维拼接(水平拼接)
concat_arr = np.concatenate((arr1, arr2))
print(concat_arr) # 输出 [1 2 3 4 5 6]
# 垂直拼接
arr3 = np.array([[1, 2], [3, 4]])
arr4 = np.array([[5, 6], [7, 8]])
vstack_arr = np.vstack((arr3, arr4))
print(vstack_arr) # 输出 [[1 2]
# [3 4]
# [5 6]
# [7 8]]
# 水平拼接
hstack_arr = np.hstack((arr3, arr4))
print(hstack_arr) # 输出 [[1 2 5 6]
# [3 4 7 8]]
要点总结:
np.concatenate()
可以沿指定轴拼接数组,适用于一维或多维数组的拼接操作。np.vstack()
用于垂直拼接数组,np.hstack()
用于水平拼接数组。- 在拼接前,确保数组的形状兼容。
练习:
将数组 [[1, 2], [3, 4]]
和 [[5, 6], [7, 8]]
垂直拼接,然后水平拼接。
答案:
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
# 垂直拼接
vstack_arr = np.vstack((arr1, arr2))
print(vstack_arr) # 输出 [[1 2]
# [3 4]
# [5 6]
# [7 8]]
# 水平拼接
hstack_arr = np.hstack((arr1, arr2))
print(hstack_arr) # 输出 [[1 2 5 6]
# [3 4 7 8]]
4.5 分割数组(使用 np.split, np.hsplit, np.vsplit 等)
引入:
有时我们需要将一个数组分割成多个数组,这在处理大数据集时非常有用。NumPy 提供了 np.split
、np.hsplit
和 np.vsplit
等函数来帮助你根据需求分割数组。
常用语法:
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 沿水平方向分割成3个数组
split_arr = np.hsplit(arr, 3)
print(split_arr) # 输出 [array([[1], [4], [7]]), array([[2], [5], [8]]), array([[3], [6], [9]])]
# 垂直方向分割成3个数组
split_arr_v = np.vsplit(arr, 3)
print(split_arr_v) # 输出 [array([[1, 2, 3]]), array([[4, 5, 6]]), array([[7, 8, 9]])]
要点总结:
np.split()
可以将数组沿指定轴分割成多个子数组,np.hsplit()
和np.vsplit()
分别用于水平和垂直分割。- 分割时,需要指定分割点或分割次数,确保数组可以均匀分割。
问题解答
由于本系列是基础教程,所以有任何问题基本上国内免费的AI模型都能回答,有任何疑问或Bug可以寻求以下免费的大模型的解答。
- 豆包:https://www.doubao.com/chat/
- 文心一言:https://yiyan.baidu.com/
- 通义千问:https://tongyi.aliyun.com/qianwen/
- 讯飞星火:https://xinghuo.xfyun.cn/desk
如果觉得有帮助的话,求 关注、收藏、点赞、星星 哦!