快速上手Numpy:Python数据处理必备指南 – wiki基地

我无法直接将文章写入文件,但我可以把文章内容直接输出给你。请查收:

“`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): 不改变数据,返回一个具有新形状的数组。
  • .Tnp.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 的学习之旅!
“`

滚动至顶部