AI闪电战:代码+实战 从Python速通到深度学习|数据处理与分析——NumPy库

想要查看本系列的其他文章请到作者主页中。
学习提示:在有别的编程基础之上,学习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]]])
要点总结:
  1. 一维数组可以看作是向量,二维数组是矩阵,三维及以上为多维数组。
  2. 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))
要点总结:
  1. np.arange() 用于生成等差序列,np.linspace() 用于生成等间距序列。
  2. 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
要点总结:
  1. shape 返回数组的维度,例如 (2, 3) 表示2行3列。
  2. dtype 表示数组中元素的数据类型。
  3. size 返回数组中总的元素数量。
练习:

创建一个三维数组,并查看它的形状和总元素个数。

答案:

arr = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(arr.shape)  # (2, 2, 2)
print(arr.size)   # 8

要点总结:

  1. NumPy 提供了多种方式创建数组,包括 arrayarangelinspacezerosones 等。
  2. 创建数组后,常用属性如 shapedtypesize 可以帮助你快速了解数组的维度、数据类型和大小。
  3. 学习数组的创建和基本操作是数据处理和分析的基础,它为后续的机器学习建模打下坚实的基础。

进一步学习:

如果你想更深入地了解 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行的前两列
要点总结:
  1. NumPy 索引从 0 开始,类似 Python 列表。
  2. 通过逗号 , 分隔行和列的索引来访问多维数组中的元素。
  3. 切片语法 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个元素
要点总结:
  1. 布尔索引允许你根据条件筛选数组中的元素。
  2. 整数数组索引可以用于从数组中选取多个特定位置的元素。
练习:

从数组 [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. 索引的每个维度可以使用一个列表或数组指定要提取的元素。
练习:

使用花式索引从数组 [[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]

要点总结:

  1. 基本索引和切片 用于访问和提取数组的子集,常用语法与 Python 列表相似。
  2. 布尔索引 可以根据条件选取数组中的元素,整数数组索引 则可以通过数组或列表选择特定位置的元素。
  3. 花式索引 是一种非常灵活的索引方式,允许同时选择多个不连续的数组元素。
  4. 索引和切片是 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]
要点总结:
  1. NumPy 数组的算术运算是元素级别的,即相同位置的元素进行运算。
  2. 你可以对数组执行加法、减法、乘法、除法等运算,或者进行标量与数组的运算。
  3. 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]]
要点总结:
  1. 广播机制能够自动匹配不同形状的数组,使它们能够进行运算。
  2. 小维度数组会扩展(广播)以匹配大维度数组,但必须满足一定的广播规则(如行或列相同)。
  3. 广播提高了数组操作的灵活性,减少了手动对齐数据的繁琐操作。
练习:

对数组 [[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.]
要点总结:
  1. NumPy 提供了大量常用的数学函数,如 sincosexplog 等,能够高效计算数组中每个元素的结果。
  2. 数学函数的调用方式与 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
要点总结:
  1. mean() 计算均值,median() 计算中位数,std() 计算标准差,var() 计算方差。
  2. 这些统计函数可以帮助你快速了解数据的分布和集中趋势。
  3. 你可以通过 axis 参数指定按行或列计算统计量。
练习:

计算数组 [[7, 8], [9, 10]] 的均值和标准差。

答案:

arr = np.array([[7, 8], [9, 10]])
print(np.mean(arr))  # 输出 8.5
print(np.std(arr))   # 输出 1.118033988749895

要点总结:

  1. 元素级运算:NumPy 支持直接对数组元素进行加、减、乘、除等运算,且无需显式循环。
  2. 广播机制:可以处理不同维度的数组运算,使得小维度数组能自动扩展以匹配大维度数组。
  3. 常用数学函数:NumPy 提供了大量数学函数,能够直接作用于数组。
  4. 统计函数:均值、方差、标准差等统计量可以帮助你快速分析数据特征。

进一步学习:

如果你想更深入地学习 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]
要点总结:
  1. np.where(condition, x, y) 根据条件 condition,返回满足条件的元素为 x,否则为 y
  2. 适用于根据条件对数组进行筛选或替换操作。
  3. 可以用于创建新的数组,或对原数组的元素进行有条件的修改。
练习:

将数组 [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]
要点总结:
  1. np.unique() 返回数组中的唯一值,适用于去重或分类操作。
  2. 该函数还可以返回唯一值的出现次数,或它们在原数组中的位置(通过参数 return_countsreturn_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]
要点总结:
  1. np.sort() 用于对数组进行升序排序,默认对整个数组排序,也可以指定按行或按列排序。
  2. 该函数不会改变原数组,而是返回一个新数组。如果需要在原地排序,可以使用 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]]
要点总结:
  1. np.concatenate() 可以沿指定轴拼接数组,适用于一维或多维数组的拼接操作。
  2. np.vstack() 用于垂直拼接数组,np.hstack() 用于水平拼接数组。
  3. 在拼接前,确保数组的形状兼容。
练习:

将数组 [[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.splitnp.hsplitnp.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]])]
要点总结:
  1. np.split() 可以将数组沿指定轴分割成多个子数组,np.hsplit()np.vsplit() 分别用于水平和垂直分割。
  2. 分割时,需要指定分割点或分割次数,确保数组可以均匀分割。

问题解答
由于本系列是基础教程,所以有任何问题基本上国内免费的AI模型都能回答,有任何疑问或Bug可以寻求以下免费的大模型的解答。

  • 豆包:https://www.doubao.com/chat/
  • 文心一言:https://yiyan.baidu.com/
  • 通义千问:https://tongyi.aliyun.com/qianwen/
  • 讯飞星火:https://xinghuo.xfyun.cn/desk

如果觉得有帮助的话,求 关注、收藏、点赞、星星 哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人工智能技术小白修炼手册

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值