我无法直接将文章写入文件,但我可以把文章内容直接输出给你。请查收:
“`markdown
快速上手Numpy:Python数据处理必备指南
在数据科学和机器学习领域,Python 已经成为不可或缺的工具。而 NumPy (Numerical Python) 则是 Python 数据处理生态系统的基石,它提供了强大的多维数组对象和一系列用于处理这些数组的函数。如果你想高效地进行数值计算和数据处理,掌握 NumPy 绝对是必不可少的第一步。
本文将带领你快速上手 NumPy,理解其核心概念和常用功能。
1. 为什么选择 NumPy?
Python 原生的列表 (list) 可以存储不同类型的数据,但在进行大规模数值计算时,它们的效率并不高。NumPy 的优势在于:
- 性能卓越:NumPy 数组在内存中是连续存储的,并且其核心运算由 C 语言实现,因此在处理大型数据集时速度远超 Python 列表。
- 功能强大:提供了丰富的数学函数,支持线性代数、傅立叶变换、随机数生成等高级操作。
- 生态系统基石:Pandas、Matplotlib、Scikit-learn 等众多流行的数据科学库都构建在 NumPy 之上。
2. 安装 NumPy
如果你已经安装了 Anaconda,NumPy 通常会预装。否则,你可以通过 pip 进行安装:
bash
pip install numpy
安装完成后,在 Python 中导入它:
python
import numpy as np
通常,我们会使用 np 作为 NumPy 的别名,这是一个约定俗成的做法。
3. NumPy 数组 (ndarray) – 核心概念
NumPy 的核心是 ndarray 对象,它是一个同构的多维数组,意味着数组中的所有元素必须是相同的数据类型。
3.1 创建数组
有多种方法可以创建 NumPy 数组:
从 Python 列表创建:
“`python
import numpy as np
一维数组
arr1 = np.array([1, 2, 3, 4, 5])
print(“一维数组:”, arr1)
输出: 一维数组: [1 2 3 4 5]
二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(“二维数组:\n”, arr2)
输出:
二维数组:
[[1 2 3]
[4 5 6]]
“`
使用内置函数创建:
np.zeros(shape): 创建一个指定形状的全零数组。np.ones(shape): 创建一个指定形状的全一数组。np.full(shape, fill_value): 创建一个指定形状并填充指定值的数组。np.arange(start, stop, step): 类似 Python 的range(),但返回ndarray。np.linspace(start, stop, num): 在指定区间内创建均匀分布的num个值。np.random.rand(d0, d1, ...): 创建指定形状的 [0, 1) 之间的随机浮点数数组。np.random.randint(low, high, size): 创建指定形状的随机整数数组。
“`python
全零数组
zeros_arr = np.zeros((2, 3))
print(“全零数组:\n”, zeros_arr)
全一数组
ones_arr = np.ones((1, 4))
print(“全一数组:”, ones_arr)
填充指定值的数组
full_arr = np.full((2, 2), 7)
print(“填充数组:\n”, full_arr)
使用 arange
range_arr = np.arange(0, 10, 2)
print(“arange数组:”, range_arr)
使用 linspace
linspace_arr = np.linspace(0, 1, 5) # 在0到1之间生成5个均匀分布的数
print(“linspace数组:”, linspace_arr)
随机数组
random_arr = np.random.rand(2, 2)
print(“随机数组:\n”, random_arr)
“`
3.2 数组属性
了解数组的属性对于处理数据至关重要:
.shape: 数组的维度(形状),一个元组。.ndim: 数组的轴(维度)的数量。.size: 数组中元素的总数。.dtype: 数组中元素的数据类型。
“`python
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(“形状 (shape):”, arr.shape) # (2, 3)
print(“维度 (ndim):”, arr.ndim) # 2
print(“元素总数 (size):”, arr.size) # 6
print(“数据类型 (dtype):”, arr.dtype) # int32 或 int64 (取决于系统)
可以指定数据类型
arr_float = np.array([1, 2, 3], dtype=np.float64)
print(“指定数据类型:”, arr_float.dtype) # float64
“`
3.3 数组索引和切片
NumPy 数组的索引和切片功能与 Python 列表类似,但更加强大,可以进行多维操作。
“`python
arr = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
访问单个元素 (行, 列)
print(“元素 (0, 1):”, arr[0, 1]) # 2
print(“元素 (2, 0):”, arr[2, 0]) # 9
切片 – 获取第一行
print(“第一行:”, arr[0, :]) # [1 2 3 4]
print(“第一行 (等价):”, arr[0]) # [1 2 3 4]
切片 – 获取所有行的第二列
print(“第二列:”, arr[:, 1]) # [ 2 6 10]
切片 – 获取子矩阵
获取前两行,第1到第3列 (不包含第3列)
sub_arr = arr[:2, 1:3]
print(“子矩阵:\n”, sub_arr)
输出:
[[2 3]
[6 7]]
布尔索引:根据条件筛选元素
arr_cond = arr[arr > 5]
print(“大于5的元素:”, arr_cond) # [ 6 7 8 9 10 11 12]
“`
4. 基本运算
NumPy 数组最重要的特性之一是支持元素级的运算,无需显式循环。
4.1 算术运算
数组之间的加、减、乘、除等运算都是元素级的。
“`python
arr_a = np.array([1, 2, 3])
arr_b = np.array([4, 5, 6])
print(“加法:”, arr_a + arr_b) # [5 7 9]
print(“减法:”, arr_a – arr_b) # [-3 -3 -3]
print(“乘法 (元素级):”, arr_a * arr_b) # [ 4 10 18]
print(“除法:”, arr_a / arr_b) # [0.25 0.4 0.5 ]
数组与标量运算
print(“数组 + 10:”, arr_a + 10) # [11 12 13]
“`
4.2 广播 (Broadcasting)
广播是 NumPy 在执行不同形状数组之间的算术运算时,自动调整数组形状以使其兼容的一种机制。
例如,当一个较小的数组和一个较大的数组进行运算时,较小的数组会被“广播”以匹配较大数组的形状。
“`python
arr_c = np.array([[1, 2, 3], [4, 5, 6]]) # 形状 (2, 3)
scalar = 10 # 标量,形状 ()
print(“广播示例 (数组 + 标量):\n”, arr_c + scalar)
输出:
[[11 12 13]
[14 15 16]]
vector = np.array([10, 20, 30]) # 形状 (3,)
print(“广播示例 (二维数组 + 一维数组):\n”, arr_c + vector)
输出:
[[11 22 33]
[14 25 36]]
“`
4.3 通用函数 (Universal Functions – ufuncs)
NumPy 提供了大量的通用函数,这些函数作用于 ndarray 的每个元素,并返回一个新的 ndarray。例如 np.sqrt(), np.exp(), np.sin() 等。
“`python
arr_d = np.array([1, 4, 9])
print(“平方根:”, np.sqrt(arr_d)) # [1. 2. 3.]
print(“指数函数:”, np.exp(arr_d)) # [ 2.71828183 54.59815003 8103.08392758]
“`
5. 常用高级操作
5.1 改变数组形状
.reshape(shape): 不改变数据,返回一个具有新形状的数组。.T或np.transpose(): 数组转置。
“`python
arr = np.arange(1, 10) # [1 2 3 4 5 6 7 8 9]
print(“原始数组:”, arr)
改变形状为 3×3
reshaped_arr = arr.reshape((3, 3))
print(“改变形状:\n”, reshaped_arr)
输出:
[[1 2 3]
[4 5 6]
[7 8 9]]
转置
transposed_arr = reshaped_arr.T
print(“转置:\n”, transposed_arr)
输出:
[[1 4 7]
[2 5 8]
[3 6 9]]
“`
注意:reshape 时,新形状的元素总数必须与原数组的元素总数相同。可以使用 -1 让 NumPy 自动推断一个维度的大小。
python
arr_new_shape = arr.reshape((3, -1)) # 自动推断为 (3, 3)
print("自动推断形状:\n", arr_new_shape)
5.2 数组合并与分割
np.concatenate((arr1, arr2, ...), axis=...): 沿指定轴连接数组。np.vstack((arr1, arr2, ...)): 垂直堆叠(按行)。np.hstack((arr1, arr2, ...)): 水平堆叠(按列)。np.split(arr, indices_or_sections, axis=...): 沿指定轴分割数组。
“`python
arr_x = np.array([[1, 2], [3, 4]])
arr_y = np.array([[5, 6], [7, 8]])
垂直堆叠 (按行)
v_stack = np.vstack((arr_x, arr_y))
print(“垂直堆叠:\n”, v_stack)
输出:
[[1 2]
[3 4]
[5 6]
[7 8]]
水平堆叠 (按列)
h_stack = np.hstack((arr_x, arr_y))
print(“水平堆叠:\n”, h_stack)
输出:
[[1 2 5 6]
[3 4 7 8]]
分割数组
split_arr = np.array([1, 2, 3, 4, 5, 6])
split_result = np.split(split_arr, 3) # 分割成3个等大小的数组
print(“分割数组:”, split_result)
输出: [array([1, 2]), array([3, 4]), array([5, 6])]
“`
5.3 统计函数
NumPy 提供了丰富的统计函数,可以对整个数组或沿特定轴进行计算。
np.min(), np.max(): 最小值、最大值。np.sum(): 求和。np.mean(): 平均值。np.std(): 标准差。np.median(): 中位数。
“`python
data = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print(“所有元素的和:”, np.sum(data)) # 45
print(“所有元素的平均值:”, np.mean(data)) # 5.0
沿轴进行计算 (axis=0 代表列,axis=1 代表行)
print(“每列的和:”, np.sum(data, axis=0)) # [12 15 18]
print(“每行的平均值:”, np.mean(data, axis=1)) # [2. 5. 8.]
print(“最大值:”, np.max(data)) # 9
print(“每行的最大值:”, np.max(data, axis=1)) # [3 6 9]
“`
6. 结语
恭喜你,你已经掌握了 NumPy 的核心概念和基本操作了!这只是 NumPy 强大功能的冰山一角。通过 ndarray、高效的运算和丰富的函数,NumPy 为你在 Python 中进行数据处理和科学计算奠定了坚实的基础。
接下来,你可以尝试:
* 深入学习更多 NumPy 函数,如排序、唯一值、文件 I/O 等。
* 结合 Pandas (用于数据结构和分析) 和 Matplotlib (用于数据可视化) 等库,进行更复杂的数据探索。
* 了解 NumPy 的高级主题,如性能优化、内存管理和更复杂的广播规则。
希望这篇指南能帮助你快速开启 NumPy 的学习之旅!
“`