提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

学习数据分析,NumPy 是绕不开的基石工具。要真正掌握它,你需要系统性地理解以下关键内容


一、NumPy是什么?

NumPy(Numerical Python)是Python中用于科学计算的核心库,提供高性能的多维数组对象(ndarray)及相关工具。它广泛用于数据分析、机器学习、图像处理等领域,是许多科学计算库(如SciPy、Pandas、TensorFlow)的基础依赖。

二、理解核心:多维数组 (ndarray)

  • 这是 NumPy 的绝对核心。 你需要深刻理解 ndarray 对象及其与 Python 原生列表的本质区别。

  • 核心优势: 它提供了高效存储和操作同构数据的能力(所有元素类型相同)。这种同质性、连续内存布局以及底层优化的 C/C++/Fortran 代码,使得 NumPy 在数值计算速度上远超 Python 列表

  • 关键概念: 掌握数组的维度形状数据类型以及步幅的概念。

import numpy as np

# 创建ndarray
py_list = [1, 2, 3, 4, 5]
np_array = np.array(py_list)

print("Python列表:", py_list)
print("NumPy数组:", np_array)
print("数组形状:", np_array.shape)  # (5,)
print("数据类型:", np_array.dtype)  # int64

# 二维数组
matrix = np.array([[1, 2, 3], [4, 5, 6]])
print("\n二维数组:\n", matrix)
print("形状:", matrix.shape)  # (2, 3)

三、精通数组创建

  • 熟练使用各种创建数组的方法:

    • 内置函数: np.array() (从列表/元组创建), np.zeros()np.ones()np.empty()np.full()np.arange() (类似 range), np.linspace() (等间距), np.eye()/np.identity() (单位矩阵)。

    • 从已有数据转换: 将 Pandas DataFrame/Series 等转换为 NumPy 数组。

    • 随机数组: np.random 模块(randrandnrandintnormaluniform 等)对于生成模拟数据至关重要。

# 特殊数组创建
zeros_arr = np.zeros((2, 3))      # 全0数组
ones_arr = np.ones((3, 2))        # 全1数组
identity = np.eye(3)              # 单位矩阵
range_arr = np.arange(0, 10, 2)   # 0-9步长2
lin_arr = np.linspace(0, 1, 5)    # 0-1的5等分点

print("zeros:\n", zeros_arr)
print("arange:", range_arr)       # [0 2 4 6 8]
print("linspace:", lin_arr)       # [0.   0.25 0.5  0.75 1.  ]

# 随机数组
rand_arr = np.random.rand(2, 2)   # 0-1均匀分布
randn_arr = np.random.randn(3)    # 标准正态分布
randint_arr = np.random.randint(1, 10, size=(2, 3))  # 1-10随机整数

四、掌握数据类型 (dtype)

  • NumPy 支持多种精确的数据类型(如 int8int16int32int64float16float32float64complexbool_string_datetime64 等)。

  • 理解选择合适 dtype 的重要性:它直接影响内存占用计算精度/范围

  • 学会查看 (array.dtype) 和转换 (array.astype()) 数组的数据类型。

# 指定数据类型
float_arr = np.array([1, 2, 3], dtype=np.float32)
bool_arr = np.array([0, 1, 0], dtype=bool)

print("浮点数组:", float_arr)     # [1. 2. 3.]
print("布尔数组:", bool_arr)      # [False  True False]

# 类型转换
int_arr = float_arr.astype(np.int16)
print("转整型:", int_arr)         # [1 2 3]

五、灵活运用索引与切片

  • 基础索引/切片: 使用 [start:stop:step] 语法访问子集(返回视图)。

  • 布尔索引: 使用布尔数组(基于条件生成)筛选数据,是数据过滤的核心技术。

  • 花式索引: 使用整数数组指定需要访问的特定位置的元素(返回拷贝)。

  • 多维索引: 熟练使用逗号分隔的索引元组访问高维数组元素。

  • 视图 vs 拷贝: 深刻理解索引操作何时返回原始数据的视图(共享内存)何时返回拷贝(独立内存),这对避免意外修改和内存管理至关重要。

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 基础索引
print("首行:", arr[0])           # [1 2 3]
print("元素[1,2]:", arr[1, 2])    # 6

# 切片
print("前两行:\n", arr[:2])       # [[1 2 3], [4 5 6]]
print("第二列:", arr[:, 1])       # [2 5 8]

# 布尔索引
mask = arr > 5
print(">5的元素:\n", mask)
print("筛选结果:", arr[mask])     # [6 7 8 9]

# 花式索引
print("选择[0,2]行:", arr[[0, 2]]) 

六、熟练进行数组操作

  • 改变形状: reshape()resize()ravel()/flatten() (展平)。

  • 数组组合: np.concatenate()np.stack()np.hstack()np.vstack()np.dstack()

  • 数组分割: np.split()np.hsplit()np.vsplit()

  • 转置与轴变换: array.Tnp.transpose()swapaxes(),理解 axis 参数在多维操作中的含义是核心。

  • 增加/删除维度: np.newaxis / Nonenp.expand_dims()np.squeeze()

arr = np.arange(6).reshape(2, 3)  # [[0 1 2], [3 4 5]]

# 改变形状
print("重塑为3x2:\n", arr.reshape(3, 2))
print("展平:", arr.flatten())      # [0 1 2 3 4 5]

# 数组组合
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
print("垂直组合:\n", np.vstack((a, b))) 
print("水平组合:\n", np.hstack((a, np.array([[7], [8]]))))

# 转置
print("转置:\n", arr.T)  # [[0 3], [1 4], [2 5]]

七、精通向量化与广播

  • 向量化: NumPy 的灵魂所在! 摒弃低效的 Python 循环,直接对整个数组或数组间进行逐元素操作(+-*/**, 比较运算符等)。这是性能提升的关键。

  • 广播: NumPy 强大的规则引擎。 理解当操作不同形状的数组时,NumPy 如何自动扩展较小数组的“虚拟副本”以匹配较大数组的形状,从而进行逐元素运算。掌握广播规则是高效利用 NumPy 进行复杂计算的基础。

# 向量化运算
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print("加法:", a + b)   # [5 7 9]
print("乘法:", a * b)   # [4 10 18]
print("标量乘法:", 2 * a) # [2 4 6]

# 广播
matrix = np.array([[1, 2, 3], [4, 5, 6]])
vector = np.array([10, 20, 30])
print("广播加法:\n", matrix + vector) 
# 结果:[[11 22 33], [14 25 36]]

八、熟练运用通用函数

  • ufunc 是对 ndarray 执行逐元素运算的高效函数。

  • 掌握常用数学函数: np.sin()np.cos()np.exp()np.log()np.sqrt()np.abs() 等。

  • 掌握常用统计函数: np.sum()np.mean()np.std()np.var()np.min()np.max()np.median()np.percentile()。特别注意 axis 参数在这些函数中的应用,用于指定沿哪个维度进行计算。

  • 逻辑函数: np.logical_and()np.logical_or()np.logical_not()

  • 比较函数: np.greater()np.less_equal()np.equal()np.not_equal() 等(通常用运算符 ><===!= 更直观)

arr = np.array([1, 4, 9, 16])

# 数学函数
print("平方根:", np.sqrt(arr))      # [1 2 3 4]
print("指数:", np.exp(arr))         # [2.718 54.598 8103.08 8886110.5]

# 统计函数
data = np.array([[1, 2], [3, 4], [5, 6]])
print("总和:", np.sum(data))         # 21
print("列平均:", np.mean(data, axis=0))  # [3 4]
print("行最大值:", np.max(data, axis=1)) # [2 4 6]

# 逻辑运算
print(">3的元素:", data > 3)

九、了解高级功能(按需深入)

  • 结构化数组: 处理具有不同数据类型的表格型数据。

  • 文件 I/O: np.loadtxt()np.genfromtxt()np.savetxt()np.save()np.savez()np.load() 用于读写磁盘数据。

  • 线性代数: np.linalg 模块 (dotmatmulinvdeteigsvdsolve 等) 是机器学习、统计建模的基础。

  • 伪随机数生成: np.random 模块的深入使用(种子设置、各种分布)。

  • 性能优化技巧: 理解向量化替代循环、避免不必要拷贝、利用 out 参数、使用 np.einsum 进行复杂求和约定等。

# 文件I/O
arr = np.arange(10)
np.save('my_array.npy', arr)  # 保存
loaded = np.load('my_array.npy')  # 加载

# 线性代数
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print("矩阵乘法:\n", A @ B)  # [[19 22], [43 50]]
print("行列式:", np.linalg.det(A))  # -2.0

# 结构化数组
data = np.array([('Alice', 25), ('Bob', 30)], 
                dtype=[('name', 'U10'), ('age', 'i4')])
print("姓名:", data['name'])  # ['Alice' 'Bob']

总结

掌握 NumPy 的核心在于深刻理解 ndarray 数据结构及其高效操作机制,特别是向量化运算广播规则。熟练运用索引切片、各种数组操作函数、通用函数 (ufunc) 和聚合函数是进行日常数据处理和分析的基础。将 NumPy 视为处理数值数据的“底层引擎”,它的高效性为 Pandas、SciPy、Scikit-learn 等更高级的数据分析库提供了强大支撑。扎实的 NumPy 功底是迈向高效数据分析师的关键一步。动手实践,多在 Jupyter Notebook 中敲代码尝试,是巩固这些知识的最佳途径!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐