零基础上手Python数据分析 (23):NumPy 数值计算基础 - 数据分析的加速“引擎”
写在前面
—— 超越原生 Python 列表,解锁高性能数值计算,深入理解 Pandas 的底层依赖
在前面一系列关于 Pandas 的学习中,我们已经领略了其在数据处理和分析方面的强大威力。我们学会了使用 DataFrame 和 Series 来高效地操作表格数据。但是,你是否好奇,Pandas 为何能够如此高效地处理大规模数据?其背后隐藏着怎样的 “秘密武器”?
答案就是我们今天要深入学习的主角——NumPy (Numerical Python)。
NumPy:Python 科学计算的基石
NumPy 是 Python 中用于 科学计算 的 基础核心库。它提供了:
- 一个强大的 N 维数组对象 (ndarray)。
- 用于操作这些数组的各种 高效函数 (例如数学运算、逻辑运算、形状操作、排序、选择等)。
- 用于线性代数、傅里叶变换和随机数生成的工具。
为什么在学习 Pandas 之后还要学习 NumPy?
你可能会问,既然 Pandas 已经那么好用了,为什么我们还要回过头来学习 NumPy? 原因主要有以下几点:
- Pandas 的底层依赖: Pandas 的核心数据结构 Series 和 DataFrame 在底层很大程度上是建立在 NumPy 的 ndarray 之上的。理解 NumPy 的 ndarray 有助于我们更深入地理解 Pandas 的工作原理和性能特性。
- 高性能数值计算: NumPy 的 ndarray 专为 高性能的数值计算 而设计。相比于 Python 内置的列表 (list),ndarray 在存储和处理大规模数值数据时具有显著的优势:
- 更少的内存占用: ndarray 存储的是 同质数据类型 (所有元素类型相同),并且存储方式更紧凑。
- 更快的计算速度: NumPy 的核心运算是用 C 语言 实现的,并且支持 向量化操作 (Vectorization),可以对整个数组进行批量操作,避免了 Python 层面低效的循环,速度远超原生 Python 代码。
- 科学计算生态系统的基础: NumPy 是 Python 科学计算生态系统 (SciPy Stack) 的基石,许多其他重要的库,如
SciPy
(科学计算库)、Matplotlib
(可视化库)、Scikit-learn
(机器学习库) 等,都依赖于 NumPy。掌握 NumPy 是深入学习这些库的前提。 - 直接应用场景: 在某些数据分析场景,特别是涉及大量 数值计算、矩阵运算、线性代数 等任务时,直接使用 NumPy 可能比 Pandas 更简洁高效。
虽然本专栏将 NumPy 放在了 Pandas 之后讲解 (因为对于初学者,直接上手 Pandas 更贴近数据分析的实际应用流程),但掌握 NumPy 的核心概念和操作,对于提升你的数据分析效率、深入理解 Pandas 以及为后续学习更高级的技术打下基础,都至关重要。
本篇博客将带你深入 NumPy 的世界,重点学习:
- NumPy 的核心数据结构:ndarray (N-维数组)
- 创建 ndarray 的多种方法
- ndarray 的重要属性
- NumPy 的核心优势:向量化运算 (UFuncs)
- ndarray 的索引与切片操作
- 布尔索引与条件筛选
掌握 NumPy,你将拥有更强大的数值计算能力,并能更深刻地理解你所使用的 Pandas 工具!
⚙️ 一、NumPy 安装与导入
与 Pandas 和 Matplotlib 类似,如果你使用 Anaconda,NumPy 通常已经预装。 若未安装,可使用 pip 或 conda 安装:
pip install numpy
# 或者
conda install numpy
在 Python 脚本或 Jupyter Notebook 中,导入 NumPy 库,并约定俗成地将其简写为 np
。
import numpy as np
🔢 二、NumPy 的核心:ndarray 对象
NumPy 最核心的概念就是 ndarray (N-dimensional array),即 N 维数组。 它是一个 同质 (homogeneous) 数据类型的 多维网格。
ndarray 的关键特性:
- 维度 (Dimensions/Axes): ndarray 可以是一维、二维、三维甚至更高维度。 维度的数量称为 秩 (rank)。
- 形状 (Shape): 一个 元组 (tuple),描述了数组在 每个维度上的大小。 例如,一个 3 行 4 列的二维数组,其形状为
(3, 4)
。 - 数据类型 (dtype): 数组中 所有元素的数据类型必须相同。 NumPy 支持多种数值数据类型,例如
int8
,int16
,int32
,int64
,uint8
(无符号整数),float16
,float32
,float64
,complex64
,complex128
,bool
,object
(可以存储 Python 对象,但会失去 NumPy 的性能优势),string_
,unicode_
等。 这与 Python 列表可以包含不同类型元素的特性形成对比。 - 固定大小 (Fixed Size): ndarray 在创建时大小是固定的。 改变数组的大小会创建一个新的数组并删除原来的数组。 这有助于提高内存效率和计算性能。
1. 创建 ndarray
有多种方法可以创建 NumPy ndarray 对象:
-
从 Python 列表或元组创建:
np.array()
这是最常用的创建方式,可以将 Python 的列表或嵌套列表转换为 ndarray。
# 创建一维数组 list1 = [1, 2, 3, 4, 5] arr1d = np.array(list1) print("一维数组 arr1d:\n", arr1d) print("arr1d 的类型:", type(arr1d)) print("arr1d 的数据类型:", arr1d.dtype)# 创建二维数组 (矩阵) list2d = [[1, 2, 3], [4, 5, 6]] arr2d = np.array(list2d) print("\n二维数组 arr2d:\n", arr2d) print("arr2d 的数据类型:", arr2d.dtype)# 创建指定数据类型的数组 arr_float = np.array([1, 2, 3], dtype=np.float64) # 指定为 float64 类型 print("\n指定数据类型的数组 arr_float:\n", arr_float) print("arr_float 的数据类型:", arr_float.dtype)arr_str = np.array([1, 2, 3], dtype=str) # 指定为字符串类型 print("\n指定数据类型的数组 arr_str:\n", arr_str) print("arr_str 的数据类型:", arr_str.dtype)
-
使用 NumPy 内置函数创建特定数组:
-
np.zeros(shape, dtype=float)
: 创建指定形状shape
且所有元素都为 0 的数组。zeros_arr = np.zeros((2, 3)) # 创建一个 2x3 的全零浮点型数组 print("\n全零数组 zeros_arr:\n", zeros_arr)
-
np.ones(shape, dtype=float)
: 创建指定形状shape
且所有元素都为 1 的数组。o
-