1 NumPy 基础概述
NumPy(Numerical Python)是Python中用于数值计算的核心库之一。它提供了多维数组对象(称为ndarray),以及用于在这些数组上执行各种数学、逻辑、统计和线性代数操作的函数。NumPy是数据科学、机器学习、科学计算和工程领域的重要工具,它的设计目标是提供高性能、灵活性和易用性的数值计算工具。
1.1 NumPy的主要特点和功能
- 多维数组对象(ndarray):NumPy的核心数据结构是
ndarray
,这是一个类似于列表的多维数组,但具有以下特点:
- 所有元素必须是相同数据类型。
- 数组的形状可以是任意的,可以是一维、二维、三维等。
- 数组的元素可以通过索引和切片访问。
- 高性能计算:NumPy的数组操作在底层是使用高度优化的C语言实现的,因此能够以非常高效的方式执行数值计算。这使得NumPy成为处理大规模数据集的首选工具。
- 广泛的数学函数:NumPy提供了丰富的数学函数,包括基本的算术操作、三角函数、指数和对数、统计函数、线性代数函数等。
- 随机数生成:NumPy包含随机数生成器,用于生成随机数和随机数组。这对于模拟和随机实验非常有用。
- 广播功能:NumPy允许您在不同形状的数组之间进行操作,通过广播功能,使得这些操作能够自动适应不同形状的数组,而无需显式编写循环。
- 文件输入输出:NumPy支持多种文件格式的读写,包括文本文件、二进制文件和NumPy的自定义二进制格式。
- 线性代数运算:NumPy提供了一组丰富的线性代数函数,如矩阵乘法、逆矩阵、特征值分解、奇异值分解等。
- 数据分析和科学计算:NumPy通常与其他库(如Pandas、SciPy和Matplotlib)一起使用,以进行数据分析、科学计算、数据可视化等任务。
- 开源和社区支持:NumPy是开源项目,拥有庞大的用户和开发者社区,因此您可以轻松获得文档、教程和支持。
总之,NumPy是Python中不可或缺的库,它为数值计算提供了强大的工具,使得在Python中进行科学计算和数据分析变得更加方便和高效。如果您在数据科学、工程或科学研究方面工作,学习和掌握NumPy是非常重要的一步。您可以通过安装NumPy并查阅其官方文档来开始使用它。
Numpy 官方手册:
1.2 NumPy 安装和导入
在使用NumPy之前,需要先安装它。您可以使用以下命令通过pip安装NumPy:
(1)用conda安装:
# Best practice, use an environment rather than install in the base env conda create -n my-env conda activate my-env # If you want to install from conda-forge conda config --env --add channels conda-forge # The actual install command conda install numpy
(2)用pip安装:
pip install numpy
安装完成后,您可以在Python中导入NumPy:
import numpy as np
通常,人们将NumPy导入为np
,以简化代码中的引用。 现在,您已经准备好开始使用NumPy进行数值计算了。
2 Numpy 数组
2.1 创建NumPy数组
使用np.array()
函数可以从Python列表或元组创建NumPy数组:
# 创建一个一维数组 arr1 = np.array([1, 2, 3, 4, 5]) # 创建一个二维数组 arr2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
2.2 数组的形状和维度
NumPy数组具有形状(shape)和维度(dimension),可以使用以下属性获取:
shape = arr.shape # 形状,返回 (5,) 表示一维数组 dim = arr.ndim # 维度,返回 1 表示一维数组
2.3 数组的数据类型
每个NumPy数组都有一个数据类型,可以使用dtype
属性查看:
dtype = arr.dtype # 返回数组的数据类型,如int64
2.4 访问和修改数组元素
您可以使用索引和切片来访问和修改数组的元素
element = arr[2] # 获取索引为2的元素,值为3 sub_array = arr[1:4] # 获取索引1到3的元素,结果为[2, 3, 4] arr[0] = 10 # 修改索引0的元素为10
3 数组操作
3.1 数组运算
NumPy支持对数组执行各种数学运算,例如加法、减法、乘法和除法。这些运算是按元素执行的:
import numpy as np arr1 = np.array([1, 2, 3]) arr2 = np.array([4, 5, 6]) # 加法 result_addition = arr1 + arr2 # [5, 7, 9] # 减法 result_subtraction = arr1 - arr2 # [-3, -3, -3] # 乘法 result_multiplication = arr1 * arr2 # [4, 10, 18] # 除法 result_division = arr1 / arr2 # [0.25, 0.4, 0.5]
3.2 数学函数
NumPy提供了丰富的数学函数,您可以对整个数组或数组的元素进行操作。以下是一些示例:
import numpy as np # 数组用于演示数学函数的功能 arr = np.array([0, 1, 2, 3, 4, 5]) # 计算指数函数 exp_values = np.exp(arr) # exp_values 现在包含了arr中每个元素的e的幂次方结果 # 计算自然对数函数(对数的逆函数) log_values = np.log(arr + 1) # 这里使用(arr + 1)来避免对0进行对数运算,因为对数函数不定义于0 # 计算平方根 sqrt_values = np.sqrt(arr) # sqrt_values 现在包含了arr中每个元素的平方根 # 计算正弦函数 sin_values = np.sin(arr) # sin_values 包含arr中每个元素的正弦值 # 计算余弦函数 cos_values = np.cos(arr) # cos_values 包含arr中每个元素的余弦值 # 计算反正弦函数 asin_values = np.arcsin(arr / 5) # asin_values 包含arr中每个元素的反正弦值 # 计算反余弦函数 acos_values = np.arccos(arr / 5) # acos_values 包含arr中每个元素的反余弦值 # 计算四舍五入的整数值 round_values = np.round(arr / 2) # round_values 包含arr中每个元素除以2并四舍五入后的整数值
具体示例:
import numpy as np # 求绝对值 absolute_value = np.abs([-1, -2, 3]) # [1 2 3] # 计算平方根 sqrt_value = np.sqrt([4, 9, 16]) # [2. 3. 4.] # 计算指数函数 exp_value = np.exp([1, 2, 3]) # [ 2.71828183 7.3890561 20.08553692] # 计算自然对数 log_value = np.log([1, 10, 100]) # [0. 2.30258509 4.60517019] # 计算以2为底的对数 log2_value = np.log2([1, 2, 4]) # [0. 1. 2.] # 计算以10为底的对数 log10_value = np.log10([1, 10, 100]) # [0. 1. 2.] # 计算幂函数 power_value = np.power([2, 3, 4], [2, 3, 2]) # [ 4 27 16] # 计算三角函数 sin_value = np.sin(np.pi / 2) # 1.0 cos_value = np.cos(np.pi) # -1.0 # 计算反三角函数 arcsin_value = np.arcsin(1) # 1.5707963267948966 arccos_value = np.arccos(0) # 1.5707963267948966 # 计算正切函数 tan_value = np.tan(np.pi / 4) # 0.9999999999999999 # 计算反正切函数 arctan_value = np.arctan(1) # 0.7853981633974483 # 计算双曲正弦函数 sinh_value = np.sinh(1) # 1.1752011936438014 # 计算双曲余弦函数 cosh_value = np.cosh(1) # 1.5430806348152437 # 计算双曲正切函数 tanh_value = np.tanh(1) # 0.7615941559557649 # 计算双曲反正弦函数 arcsinh_value = np.arcsinh(1) # 0.881373587019543 # 计算双曲反余弦函数 arccosh_value = np.arccosh(2) # 1.3169578969248166 # 计算双曲反正切函数 arctanh_value = np.arctanh(0.5) # 0.5493061443340548 # 计算四舍五入 round_value = np.round([1.2, 2.7, 3.5]) # [1. 3. 4.] # 计算向上取整 ceil_value = np.ceil([1.2, 2.7, 3.5]) # [2. 3. 4.] # 计算向下取整 floor_value = np.floor([1.2, 2.7, 3.5]) # [1. 2. 3.]
以上是一系列NumPy中数学函数的示例,包括绝对值、平方根、指数函数、自然对数、以2为底的对数、以10为底的对数、幂函数、三角函数、反三角函数、双曲函数、反双曲函数、四舍五入、向上取整和向下取整。这些函数允许您执行各种数学运算和变换,对数据进行处理和分析。
3.3 统计函数
NumPy提供了各种统计函数,可以帮助您分析数组的统计属性,如均值、总和、最大值和最小值等。以下是示例:
import numpy as np # 创建一个示例数组 data = np.array([1, 2, 2, 3, 3, 3, 4, 4, 4, 4]) # 计算平均值 mean = np.mean(data) # 平均值为 3.0 # 计算中位数 median = np.median(data) # 中位数为 3.0 # 计算众数 from scipy import stats mode = stats.mode(data) # 众数为 ModeResult(mode=array([4]), count=array([4])) # 计算标准差 std_deviation = np.std(data) # 标准差为 1.118033988749895 # 计算方差 variance = np.var(data) # 方差为 1.25 # 计算最小值和最大值 min_value = np.min(data) # 最小值为 1 max_value = np.max(data) # 最大值为 4 # 计算百分位数 percentile_25 = np.percentile(data, 25) # 25th 百分位数为 2.25 percentile_75 = np.percentile(data, 75) # 75th 百分位数为 3.75 # 计算数据范围 data_range = np.ptp(data) # 数据范围为 3 # 计算数据的四分位距 iqr = np.percentile(data, 75) - np.percentile(data, 25) # 四分位距为 1.5 # 计算数据的和 total_sum = np.sum(data) # 总和为 30 # 计算累积和 cumulative_sum = np.cumsum(data) # [ 1 3 5 8 11 14 18 22 26 30] # 计算累积积 cumulative_product = np.cumprod(data) # [ 1 2 4 12 36 108 432 1728 6912 27648] # 计算均方根(Root Mean Square) rms = np.sqrt(np.mean(np.square(data))) # 均方根为 2.160246899469287 # 计算协方差矩阵 data1 = np.array([1, 2, 3, 4, 5]) data2 = np.array([5, 4, 3, 2, 1]) covariance_matrix = np.cov(data1, data2) # 结果是一个协方差矩阵 # 计算相关系数 correlation_coefficient = np.corrcoef(data1, data2) # 结果是相关系数矩阵
示例演示了如何使用NumPy中的统计函数来计算各种统计量,包括平均值、中位数、众数、标准差、方差、最小值、最大值、百分位数、数据范围、四分位距、总和、累积和、累积积、均方根、协方差矩阵和相关系数。这些函数对于数据分析非常有用。
4 数组形状操作
4.1 重塑数组形状
重塑数组的形状是常见的操作,特别是在与不同形状的数据进行操作时。使用reshape()
函数可以改变数组的形状,但请注意新形状的元素数量必须与原始数组相同。
4.2 数组的转置
数组的转置操作是将数组的行和列进行交换。您可以使用.T
属性来获取数组的转置。
4.3 数组展平
展平数组意味着将多维数组转换为一维数组。您可以使用ravel()
函数或flatten()
函数来实现这一目标。
4.4 改变数组的大小
使用resize()函数可以改变数组的大小,不需要考虑新形状与原始数组的元素数量是否兼容。如果新数组大于原始数组,多余的元素将被填充0。
4.5 堆叠数组
堆叠数组是将多个数组按垂直或水平方向堆叠在一起。您可以使用vstack()函数垂直堆叠和hstack()函数水平堆叠数组。
4.6 拆分数组
拆分数组是将一个数组拆分成多个子数组。使用split()
函数可以按指定位置拆分数组。
以上示例代码:
import numpy as np # 创建一个示例数组 arr = np.array([[1, 2, 3], [4, 5, 6]]) # 1. 重塑数组形状 (reshape) # 用于改变数组的形状,返回一个新的视图。 reshaped = arr.reshape(3, 2) # 结果为: # [[1 2] # [3 4] # [5 6]] # 2. 数组的转置 (T属性) # 返回原始数组的转置,即交换行和列。 transposed = arr.T # 结果为: # [[1 4] # [2 5] # [3 6]] # 3. 改变数组的大小 (resize) # 允许调整数组的大小,可以增加或减少元素的数量。 resized = np.resize(arr, (2, 4)) # 结果为: # [[1 2 3 4] # [5 6 1 2]] # 4. 数组连接 (vstack, hstack) # vstack用于垂直堆叠多个数组,hstack用于水平堆叠多个数组。 arr1 = np.array([1, 2]) arr2 = np.array([3, 4]) vertical_stack = np.vstack((arr1, arr2)) # 结果为: # [[1 2] # [3 4]] horizontal_stack = np.hstack((arr1, arr2)) # 结果为: # [1 2 3 4] # 5. 拆分数组 (split) # 用于将一个数组拆分为多个子数组,可以指定拆分的位置。 split_arr = np.split(arr, 2) # 在索引2处拆分数组,结果为两个子数组: # 子数组1: [[1 2 3]] # 子数组2: [[4 5 6]] # 6. 数组展平 (ravel, flatten) # ravel和flatten函数用于将多维数组展平为一维数组。 flattened = arr.ravel() # 结果为一维数组: [1 2 3 4 5 6] # 可以使用flatten()函数进行展平,效果相同: flattened_using_flatten = arr.flatten() # 7. 更改数组的维度 (ndarray.shape) # 使用数组的shape属性来直接更改数组的形状。 arr.shape = (3, 2) # 这会将数组的形状更改为3x2。 # 8. 调整数组的大小 (resize) # resize函数也可用于调整数组的大小,但可以指定refcheck参数以避免数据损失。 resized = np.resize(arr, (2, 4), refcheck=False) # 结果为: # [[1 2 3 4] # [5 6 1 2]]
这些数组形状操作在数据预处理、图像处理、机器学习、科学计算等领域都有广泛的应用。它们使得在处理不同形式和维度的数据时更加灵活,并且可以使数据适应不同的算法和任务。