1.3 NumPy 的基本使用流程 1.3 NumPy 的基本使用流程 NumPy (Numerical Python) 是 Python 中用于科学计算的基础包。它提供了一个高性能的多维数组对象 ,以及用于处理这些数组的工具。NumPy 是许多其他科学计算库(如 SciPy、Pandas、Scikit-learn)的基础。 本节将详细介绍 NumPy 的基本使用流程,包括安装、导入、创建数组、数组属性、基本操作以及索引和切片。 1.3.1 安装 NumPy 在使用 NumPy 之前,需要先安装它。推荐使用 pip 包管理器进行安装: 或者使用 conda: 安装完成后,就可以在 Python 代码中导入 NumPy 了。 1.3.
NumPy (Numerical Python) 是 Python 中用于科学计算的基础包。它提供了一个高性能的多维数组对象 ndarray,以及用于处理这些数组的工具。NumPy 是许多其他科学计算库(如 SciPy、Pandas、Scikit-learn)的基础。
本节将详细介绍 NumPy 的基本使用流程,包括安装、导入、创建数组、数组属性、基本操作以及索引和切片。
在使用 NumPy 之前,需要先安装它。推荐使用 pip 包管理器进行安装:
pip install numpy
或者使用 conda:
conda install numpy
安装完成后,就可以在 Python 代码中导入 NumPy 了。
通常使用 import numpy as np 导入 NumPy,np 是 NumPy 的常用别名,方便后续使用。
import numpy as np
NumPy 的核心是 ndarray 对象,它可以存储相同类型的元素,并且支持高效的数值运算。创建 NumPy 数组有多种方式:
可以使用 np.array() 函数从 Python 列表或元组创建 NumPy 数组。
# 从列表创建 list1 = [1, 2, 3, 4, 5] arr1 = np.array(list1) print(arr1) # 输出: [1 2 3 4 5] print(type(arr1)) # 输出: <class 'numpy.ndarray'> # 从元组创建 tuple1 = (6, 7, 8, 9, 10) arr2 = np.array(tuple1) print(arr2) # 输出: [ 6 7 8 9 10]
NumPy 提供了许多内置函数来创建特定类型的数组,例如:
np.zeros():创建全零数组。
np.ones():创建全一数组。
np.empty():创建未初始化数组(内容随机)。
np.arange():创建等差数组。
np.linspace():创建指定范围内的等间隔数组。
np.random.rand():创建随机数组(0-1之间的均匀分布)。
np.random.randn():创建随机数组(标准正态分布)。
np.full(): 创建指定值的数组
# 创建全零数组 zeros_arr = np.zeros((2, 3)) # 创建一个 2x3 的全零数组 print("全零数组:\n", zeros_arr) # 输出: # 全零数组: # [[0. 0. 0.] # [0. 0. 0.]] # 创建全一数组 ones_arr = np.ones((3, 2)) # 创建一个 3x2 的全一数组 print("全一数组:\n", ones_arr) # 输出: # 全一数组: # [[1. 1.] # [1. 1.] # [1. 1.]] # 创建未初始化数组 empty_arr = np.empty((2, 2)) # 创建一个 2x2 的未初始化数组 print("未初始化数组:\n", empty_arr) # 输出 (内容随机): # 未初始化数组: # [[6.9e-310 6.9e-310] # [6.9e-310 6.9e-310]] # 创建等差数组 arange_arr = np.arange(0, 10, 2) # 创建一个从 0 到 10 (不包括 10) 步长为 2 的数组 print("等差数组:\n", arange_arr) # 输出: [0 2 4 6 8] # 创建等间隔数组 linspace_arr = np.linspace(0, 1, 5) # 创建一个从 0 到 1 (包括 1) 等间隔的 5 个元素的数组 print("等间隔数组:\n", linspace_arr) # 输出: [0. 0.25 0.5 0.75 1. ] # 创建随机数组(0-1之间的均匀分布) rand_arr = np.random.rand(2,3) print("随机数组(均匀分布):\n", rand_arr) # 创建随机数组(标准正态分布) randn_arr = np.random.randn(2,3) print("随机数组(正态分布):\n", randn_arr) # 创建指定值的数组 full_arr = np.full((2,3), 7) print("指定值的数组:\n", full_arr)
np.reshape() 改变数组形状可以改变数组的形状,但不改变数组的元素。
arr = np.arange(12) reshaped_arr = arr.reshape(3, 4) # 将一维数组变为 3x4 的二维数组 print("改变形状后的数组:\n", reshaped_arr) # 输出: # 改变形状后的数组: # [[ 0 1 2 3] # [ 4 5 6 7] # [ 8 9 10 11]]
NumPy 数组具有许多有用的属性,可以帮助了解数组的结构和内容。
ndim:数组的维度(轴)的数量。
shape:数组的形状(每个维度的大小)。
size:数组中元素的总数。
dtype:数组中元素的数据类型。
itemsize:数组中每个元素的大小(以字节为单位)。
arr = np.array([[1, 2, 3], [4, 5, 6]]) print("数组维度:", arr.ndim) # 输出: 2 print("数组形状:", arr.shape) # 输出: (2, 3) print("数组大小:", arr.size) # 输出: 6 print("数据类型:", arr.dtype) # 输出: int64 (或 int32,取决于系统) print("元素大小:", arr.itemsize) # 输出: 8 (或 4,取决于系统)
NumPy 数组支持各种基本操作,包括算术运算、比较运算、逻辑运算等。这些操作通常是逐元素的。
arr1 = np.array([[1, 2], [3, 4]]) arr2 = np.array([[5, 6], [7, 8]]) # 加法 print("加法:\n", arr1 + arr2) # 输出: # 加法: # [[ 6 8] # [10 12]] # 减法 print("减法:\n", arr1 - arr2) # 输出: # 减法: # [[-4 -4] # [-4 -4]] # 乘法 (逐元素) print("乘法:\n", arr1 * arr2) # 输出: # 乘法: # [[ 5 12] # [21 32]] # 除法 print("除法:\n", arr1 / arr2) # 输出: # 除法: # [[0.2 0.33333333] # [0.42857143 0.5 ]] # 矩阵乘法 print("矩阵乘法:\n", arr1 @ arr2) # 或者使用 arr1.dot(arr2) # 输出: # 矩阵乘法: # [[19 22] # [43 50]]
arr1 = np.array([1, 2, 3, 4, 5]) arr2 = np.array([3, 2, 1, 4, 6]) # 大于 print("大于:\n", arr1 > arr2) # 输出: [False False True False False] # 小于 print("小于:\n", arr1 < arr2) # 输出: [ True False False False True] # 等于 print("等于:\n", arr1 == arr2) # 输出: [False True False True False]
arr = np.array([True, False, True, False]) # 与 print("与:\n", np.logical_and(arr, True)) # 输出: [ True False True False] # 或 print("或:\n", np.logical_or(arr, False)) # 输出: [ True False True False] # 非 print("非:\n", np.logical_not(arr)) # 输出: [False True False True]
NumPy 提供了大量的通用函数 (ufunc),可以对数组进行逐元素的操作。 例如:np.sin(), np.cos(), np.exp(), np.log() 等。
arr = np.array([0, 1, 2, 3]) print("sin:\n", np.sin(arr)) print("exp:\n", np.exp(arr))
NumPy 数组的索引和切片与 Python 列表类似,但更加强大。
arr = np.array([10, 20, 30, 40, 50]) # 索引 print("索引:", arr[0]) # 输出: 10 print("索引:", arr[-1]) # 输出: 50 # 切片 print("切片:", arr[1:4]) # 输出: [20 30 40] print("切片:", arr[:3]) # 输出: [10 20 30] print("切片:", arr[3:]) # 输出: [40 50] print("切片:", arr[:]) # 输出: [10 20 30 40 50]
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 索引 print("索引:", arr[0, 0]) # 输出: 1 print("索引:", arr[1, 2]) # 输出: 6 # 切片 print("切片:\n", arr[0:2, 1:3]) # 输出: # 切片: # [[2 3] # [5 6]] print("切片:\n", arr[:, 0]) # 获取所有行的第一列 # 输出: # 切片: # [1 4 7] print("切片:\n", arr[1, :]) # 获取第二行所有列 # 输出: # 切片: # [4 5 6]
可以使用布尔数组来选择数组中的元素。
arr = np.array([1, 2, 3, 4, 5]) bool_arr = arr > 2 # 创建一个布尔数组 print("布尔数组:\n", bool_arr) # 输出: [False False True True True] print("布尔索引:\n", arr[bool_arr]) # 使用布尔数组选择元素 # 输出: # 布尔索引: # [3 4 5] # 也可以直接使用条件表达式 print("条件索引:\n", arr[arr > 2]) # 输出: [3 4 5]
可以使用整数数组来选择数组中的元素。
arr = np.array([10, 20, 30, 40, 50]) index_arr = np.array([0, 2, 4]) # 创建一个索引数组 print("花式索引:\n", arr[index_arr]) # 使用索引数组选择元素 # 输出: # 花式索引: # [10 30 50] arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) row_indices = np.array([0, 2]) col_indices = np.array([1, 2]) print("花式索引2D:\n", arr2d[row_indices, col_indices]) # 选取(0,1)和(2,2)
理解 NumPy 数组的拷贝与视图至关重要,因为它们会影响对数组的修改。
视图 (View): 视图是指对原始数组的引用。修改视图会影响原始数组,反之亦然。 切片操作通常会创建视图。
拷贝 (Copy): 拷贝是指创建一个新的数组,其内容与原始数组相同。修改拷贝不会影响原始数组。 使用 arr.copy() 可以创建一个拷贝。
arr = np.array([1, 2, 3, 4, 5]) # 创建视图 view_arr = arr[1:4] print("原始数组:\n", arr) # 输出: [1 2 3 4 5] print("视图:\n", view_arr) # 输出: [2 3 4] view_arr[0] = 100 # 修改视图 print("修改后的视图:\n", view_arr) # 输出: [100 3 4] print("修改后的原始数组:\n", arr) # 输出: [ 1 100 3 4 5] 原始数组也被修改 # 创建拷贝 copy_arr = arr.copy() print("原始数组:\n", arr) print("拷贝:\n", copy_arr) copy_arr[0] = 200 # 修改拷贝 print("修改后的拷贝:\n", copy_arr) # 输出: [200 100 3 4 5] print("修改后的原始数组:\n", arr) # 输出: [ 1 100 3 4 5] 原始数组未被修改
以下是使用 NumPy 的基本流程的总结:
本节介绍了 NumPy 的基本使用流程,包括安装、导入、创建数组、数组属性、基本操作以及索引和切片。 掌握这些基本知识是使用 NumPy 进行科学计算的基础。 NumPy 提供了强大的数组操作功能和高效的数值运算,可以极大地简化和加速科学计算任务。 通过熟练掌握 NumPy,可以更高效地进行数据分析、机器学习、图像处理等领域的开发工作。