第十四章:数据分析基础库NumPy(一)
数据分析基础库 NumPy
文章目录
- 数据分析基础库 NumPy
- 一、引言
- 二、NumPy 基础与 ndarray 介绍
- 2.1 NumPy 简介与安装
- 2.2 ndarray 对象介绍
- 三、ndarray 的创建方法
- 3.1 从 Python 数据结构创建
- 3.2 基于数值范围生成
- 3.3 预定义形状填充
- 3.4 特殊矩阵生成
- 3.5 随机数组生成
- 四、ndarray 的基本属性
- 4.1 形状相关属性
- 4.2 数据类型相关属性
- 4.3 数组转换与重塑
一、引言
NumPy(Numerical Python)是 Python 科学计算的基础库,为 Python 提供了高性能的多维数组对象和大量数学函数,是进行数据分析、机器学习和科学计算的基石。
学习目标:
-
理解 NumPy 数组(ndarray)的优势和应用场景
-
掌握 ndarray 的创建方法和基本属性
-
熟练使用数组进行基本运算和高级操作
-
掌握数组的索引与切片技术
-
应用常用统计函数进行数据分析
课程重点:
-
ndarray 的高效存储和快速运算特性
-
不同类型数组的创建方法
-
数组的基本运算和矩阵运算
-
数组的索引与切片操作
-
常用统计函数的应用
二、NumPy 基础与 ndarray 介绍
2.1 NumPy 简介与安装
NumPy 是 Python 的一个开源数值计算扩展库,专为处理大型多维数组和矩阵数据而设计。它提供了高效的存储结构和运算函数,使得数值计算变得简洁而快速。
NumPy 的核心优势:
-
高效的存储方式,节省内存空间
-
向量化运算,避免显式循环,提高执行速度
-
丰富的数学函数库,支持各种科学计算
-
与其他科学计算库(如 SciPy、Pandas)无缝集成
安装 NumPy:
# 使用pip安装
pip install numpy# 验证安装
python -c "import numpy; print(numpy.__version__)"
导入 NumPy:
import numpy as np # 习惯上使用np作为别名
2.2 ndarray 对象介绍
ndarray(N-dimensional array)是 NumPy 的核心数据结构,代表一个多维的数组对象。与 Python 列表不同,ndarray 中的所有元素必须是相同类型的数据,这使得 ndarray 在存储和运算上更加高效。
ndarray 与 Python 列表的对比:
特性 | ndarray | Python 列表 |
---|---|---|
存储效率 | 高,元素类型相同 | 低,元素类型可不同 |
运算速度 | 极快,向量化操作 | 较慢,需显式循环 |
内存布局 | 连续存储 | 分散存储 |
数学运算 | 直接支持元素级运算 | 需借助第三方库或循环实现 |
操作演示 1:ndarray 与列表运算速度对比
假设我们需要计算两个包含 1000000 个元素的数组的和,分别使用 ndarray 和列表实现:
import numpy as np
import time# 使用ndarray
arr_np = np.arange(1000000)
start = time.time()
result_np = arr_np + arr_np
print("ndarray运算时间:", time.time() - start) # 约0.0001秒# 使用列表
list_py = list(range(1000000))
start = time.time()
result_list = [x + y for x, y in zip(list_py, list_py)]
print("列表运算时间:", time.time() - start) # 约0.08秒
输出结果:
ndarray运算时间: 0.000123456列表运算时间: 0.087654321
从结果可以看出,ndarray 的运算速度比列表快约 700 倍!这正是 NumPy 在科学计算中广泛应用的主要原因之一。
三、ndarray 的创建方法
3.1 从 Python 数据结构创建
创建 ndarray 最直接的方法是使用np.array()
函数,将 Python 列表、元组等序列类型转换为 ndarray。
基本语法:
np.array(object, dtype=None)
示例 1:创建一维数组
# 从列表创建一维数组
arr1 = np.array([1, 2, 3, 4, 5])
print("一维数组:", arr1)
print("数组类型:", type(arr1)) # 输出:<class 'numpy.ndarray'>
示例 2:创建二维数组
# 从嵌套列表创建二维数组
arr2d = np.array([[1, 2, 3], [4, 5, 6]])
print("二维数组:")
print(arr2d)
示例 3:指定数据类型
# 创建浮点型数组
arr_float = np.array([1, 2, 3], dtype=np.float32)
print("浮点型数组:", arr_float)
print("数据类型:", arr_float.dtype) # 输出:float32
3.2 基于数值范围生成
NumPy 提供了多种基于数值范围生成数组的方法,适用于生成规则序列。
常用函数:
函数 | 功能 | 示例 |
---|---|---|
np.arange() | 创建等差数组 | np.arange(0, 10, 2) → [0, 2, 4, 6, 8] |
np.linspace() | 创建等分数组 | np.linspace(0, 1, 5) → [0.0, 0.25, 0.5, 0.75, 1.0] |
np.logspace() | 创建对数等分数组 | np.logspace(0, 2, 3) → [1.0, 10.0, 100.0] |
示例 1:使用 arange 创建等差数组
# 创建从0到10(不包含10),步长为2的数组
arr_arange = np.arange(0, 10, 2)
print("arange生成的数组:", arr_arange)
示例 2:使用 linspace 创建等分数组
# 创建从0到1,包含5个等间距数值的数组
arr_linspace = np.linspace(0, 1, 5)
print("linspace生成的数组:", arr_linspace)
示例 3:使用 logspace 创建对数等分数组
# 创建从10^0到10^2,包含3个等比数值的数组
arr_logspace = np.logspace(0, 2, 3)
print("logspace生成的数组:", arr_logspace)
3.3 预定义形状填充
NumPy 提供了一系列函数,可以快速创建具有特定形状和初始值的数组,适用于初始化操作。
常用函数:
函数 | 功能 | 示例 |
---|---|---|
np.zeros() | 创建全零数组 | np.zeros((3, 4)) → 3x4 全零数组 |
np.ones() | 创建全一数组 | np.ones((2, 5)) → 2x5 全一数组 |
np.full() | 创建填充指定值的数组 | np.full((3, 3), 5) → 3x3 全 5 数组 |
np.empty() | 创建未初始化数组 | np.empty((2, 2)) → 未初始化数组,值随机 |
示例 1:创建全零数组
# 创建3行4列的全零数组
zeros_arr = np.zeros((3, 4))
print("全零数组:")
print(zeros_arr)
示例 2:创建全一数组并指定数据类型
# 创建2行5列的全一数组,数据类型为int
ones_arr = np.ones((2, 5), dtype=int)
print("全一数组:")
print(ones_arr)
示例 3:创建填充指定值的数组
# 创建3x3的全5数组
full_arr = np.full((3, 3), 5)
print("全5数组:")
print(full_arr)
3.4 特殊矩阵生成
在数学和线性代数中,一些特殊矩阵(如单位矩阵、对角矩阵)具有特定的结构和用途。NumPy 提供了专门的函数来创建这些特殊矩阵。
常用函数:
函数 | 功能 | 示例 |
---|---|---|
np.eye() | 创建单位矩阵 | np.eye(3) → 3x3 单位矩阵 |
np.diag() | 创建对角矩阵 | np.diag([1, 2, 3]) → 对角线为 1,2,3 的矩阵 |
np.tri() | 创建下三角矩阵 | np.tri(3) → 3x3 下三角矩阵 |
示例 1:创建单位矩阵
# 创建3x3的单位矩阵
eye_arr = np.eye(3)
print("单位矩阵:")
print(eye_arr)
示例 2:创建对角矩阵
# 创建对角线为1, 2, 3的对角矩阵
diag_arr = np.diag([1, 2, 3])
print("对角矩阵:")
print(diag_arr)
3.5 随机数组生成
在模拟实验、机器学习等场景中,随机数组非常有用。NumPy 的random
子模块提供了多种生成随机数组的方法。
常用函数:
函数 | 功能 | 示例 |
---|---|---|
np.random.rand() | 均匀分布随机数 | np.random.rand(2, 3) → 2x3 均匀分布随机数 |
np.random.randn() | 正态分布随机数 | np.random.randn(2, 3) → 2x3 标准正态分布随机数 |
np.random.randint() | 随机整数数组 | np.random.randint(1, 10, (2, 2)) → 2x2 随机整数数组 |
示例 1:生成均匀分布随机数
# 生成2x3的均匀分布随机数数组
rand_arr = np.random.rand(2, 3)
print("均匀分布随机数组:")
print(rand_arr)
示例 2:生成正态分布随机数
# 生成2x3的标准正态分布随机数数组
randn_arr = np.random.randn(2, 3)
print("正态分布随机数组:")
print(randn_arr)
示例 3:生成随机整数数组
# 生成2x2的随机整数数组,数值范围[1, 10)
randint_arr = np.random.randint(1, 10, (2, 2))
print("随机整数数组:")
print(randint_arr)
四、ndarray 的基本属性
了解 ndarray 的基本属性对于正确理解和操作数组至关重要。这些属性提供了数组的关键信息,如形状、数据类型、维度等。
4.1 形状相关属性
shape
属性:返回一个元组,表示数组的维度大小。对于二维数组,形状元组的第一个元素是行数,第二个是列数。
示例:
# 创建不同形状的数组
arr1d = np.array([1, 2, 3, 4, 5])
arr2d = np.array([[1, 2, 3], [4, 5, 6]])
arr3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])# 查看形状
print("一维数组形状:", arr1d.shape) # 输出:(5,)
print("二维数组形状:", arr2d.shape) # 输出:(2, 3)
print("三维数组形状:", arr3d.shape) # 输出:(2, 2, 2)
ndim
属性:返回数组的维度数量(轴的个数)。
示例:
print("一维数组维度:", arr1d.ndim) # 输出:1
print("二维数组维度:", arr2d.ndim) # 输出:2
print("三维数组维度:", arr3d.ndim) # 输出:3
size
属性:返回数组中所有元素的总数。
示例:
print("一维数组元素总数:", arr1d.size) # 输出:5print("二维数组元素总数:", arr2d.size) # 输出:6print("三维数组元素总数:", arr3d.size) # 输出:8
4.2 数据类型相关属性
dtype
属性:返回数组元素的数据类型。NumPy 支持多种数据类型,包括整数、浮点数、布尔值、复数等。
示例:
# 创建不同数据类型的数组
arr_int = np.array([1, 2, 3], dtype=np.int32)
arr_float = np.array([1.0, 2.0, 3.0], dtype=np.float64)
arr_bool = np.array([True, False, True])# 查看数据类型
print("整数数组类型:", arr_int.dtype) # 输出:int32
print("浮点数组类型:", arr_float.dtype) # 输出:float64
print("布尔数组类型:", arr_bool.dtype) # 输出:bool
itemsize
属性:返回数组中每个元素占用的字节数。
示例:
print("int32数组元素大小:", arr_int.itemsize) # 输出:4(字节)
print("float64数组元素大小:", arr_float.itemsize) # 输出:8(字节)
print("bool数组元素大小:", arr_bool.itemsize) # 输出:1(字节)
nbytes
属性:返回数组占用的总字节数,等于size
乘以itemsize
。
示例:
print("int32数组总字节数:", arr_int.nbytes) # 输出:12(3元素 × 4字节)
print("float64数组总字节数:", arr_float.nbytes) # 输出:24(3元素 × 8字节)
4.3 数组转换与重塑
reshape()
方法:返回一个具有新形状的数组视图,而不改变原始数据。
示例:
# 创建一维数组
arr = np.arange(12)
print("原始数组:", arr) # 输出:[0 1 2 3 4 5 6 7 8 9 10 11]# 重塑为3行4列的二维数组
reshaped_arr = arr.reshape(3, 4)
print("重塑后的数组:")
print(reshaped_arr)
ravel()
方法:返回一个展平的一维数组。
示例:
# 将二维数组展平为一维数组
flattened_arr = reshaped_arr.ravel()
print("展平后的数组:", flattened_arr) # 输出:[0 1 2 3 4 5 6 7 8 9 10 11]