NumPy 的核心是其主要数据结构:N 维数组,常称为 ndarray。可以将其视为专为数值数据设计的高效、灵活的容器。尽管标准的 Python 列表功能多用,但它们未针对数据科学和机器学习中常见的大规模数值运算进行优化。NumPy 数组解决了这些限制。ndarray 有何独特之处?同质数据类型: 与 Python 列表不同,Python 列表可以存储不同类型的元素(例如,整数、字符串和浮点数都可以在一个列表中),而单个 NumPy 数组中的所有元素必须是相同的数据类型。这种同质性是 NumPy 性能的重要因素。了解每个元素(例如)是 64 位浮点数,使 NumPy 能够使用高度优化的底层 C 代码进行计算,从而避免了与 Python 动态类型相关的许多额外开销。固定大小: 创建 NumPy 数组时,其大小通常是固定的。尽管 NumPy 提供了改变数组大小的函数,但这些操作通常涉及创建新数组和复制数据,而非原地调整原始数组大小。这种固定大小的特点有助于内存分配和访问的效率。多维性: 顾名思义,ndarray 可以有多个维度。一维数组 类似于列表或向量。二维数组 类似于带有行和列的表格或矩阵。数组可以有 3、4 甚至更多维度,允许表示复杂数据集,例如彩色图像(维度 1:高度,维度 2:宽度,维度 3:颜色通道)或矩阵序列。每个维度都称为一个轴。高效性: 由于 ndarray 将数据存储在连续的内存块中并使用编译过的 C 代码执行操作,对其进行的数学运算明显快于使用循环在 Python 列表上执行的等效操作。这种能力,常称为向量化,允许您对数据执行批量操作而无需编写显式循环,从而产生简洁且更快的代码。我们来直观地展示一维数组和二维数组之间的区别:digraph G { rankdir=LR; node [shape=box, style=filled, fillcolor="#e9ecef"]; edge [color="#adb5bd"]; subgraph cluster_1d { label = "一维数组 (向量)"; a0 [label="值 0\n(索引 0)"]; a1 [label="值 1\n(索引 1)"]; a2 [label="值 2\n(索引 2)"]; a0 -> a1 -> a2; } subgraph cluster_2d { label = "二维数组 (矩阵)"; node [shape=plaintext]; // 使用纯文本作为网格布局 ranksep=0.3; nodesep=0.3; // 用于结构的隐形节点 p00 [label=""]; p01 [label=""]; p02 [label=""]; p10 [label=""]; p11 [label=""]; p12 [label=""]; // 实际数据节点 b00 [label="值 (0,0)", shape=box, fillcolor="#ced4da"]; b01 [label="值 (0,1)", shape=box, fillcolor="#ced4da"]; b02 [label="值 (0,2)", shape=box, fillcolor="#ced4da"]; b10 [label="值 (1,0)", shape=box, fillcolor="#ced4da"]; b11 [label="值 (1,1)", shape=box, fillcolor="#ced4da"]; b12 [label="值 (1,2)", shape=box, fillcolor="#ced4da"]; // 水平结构 { rank=same; p00 -> p01 -> p02 [style=invis]; } { rank=same; p10 -> p11 -> p12 [style=invis]; } { rank=same; b00 -> b01 -> b02 [style=invis]; } // 将数据节点放置在网格上 { rank=same; b10 -> b11 -> b12 [style=invis]; } // 垂直结构 p00 -> p10 [style=invis]; p01 -> p11 [style=invis]; p02 -> p12 [style=invis]; b00 -> b10 [style=invis]; // 垂直连接 b01 -> b11 [style=invis]; b02 -> b12 [style=invis]; // 将数据节点相对于结构定位 b00 -> p00 [style=invis]; b01 -> p01 [style=invis]; b02 -> p02 [style=invis]; b10 -> p10 [style=invis]; b11 -> p11 [style=invis]; b12 -> p12 [style=invis]; } }一个简单的一维数组(序列)和二维数组(网格)的可视化表示。快速看一下 ndarray 对象在 Python 代码中是什么样子。我们很快将详细介绍创建方法。# 导入 NumPy 库,通常别名为 'np' import numpy as np # 创建一个简单的 Python 列表 python_list = [10, 20, 30, 40, 50] # 将列表转换为 NumPy ndarray numpy_array = np.array(python_list) # 打印数组及其类型 print("NumPy 数组:", numpy_array) print("类型:", type(numpy_array))运行此代码将输出:NumPy Array: [10 20 30 40 50] Type: <class 'numpy.ndarray'>注意输出 [10 20 30 40 50] 看起来与列表相似,但没有逗号。这是 NumPy 一维数组的标准字符串表示形式。其类型证实我们现在正在使用 NumPy 的专用 ndarray 对象。了解 ndarray 是运用 NumPy 能力进行高效数据处理和计算的第一步。随后的章节将引导您创建这些数组并更仔细地检查它们的属性。