HOWTO · NumPy

将 Pandas 系列转换为 NumPy 数组

使用 `Series.to_numpy()` 将 pandas Series 的值转换为 NumPy 数组;Series 的索引与值数组分开处理。

本页内容

pandas Series 会将值与标签索引一起保存。若要获取由这些值组成的 NumPy 数组,请直接对 Series 调用 Series.to_numpy()。数组不包含标签;如果后续步骤需要索引,请单独保留或转换索引。

使用 Series.to_numpy() 将 pandas Series 转换为 NumPy 数组

需要 NumPy ndarray 时,Series.to_numpy() 是直接的选择。示例创建一个包含两个数值及其标签的 Series,将 Series 中的值转换为数组,然后检查数组及其 dtype。输出的值为 [82 91],数组 dtype 为 int64。

运行以下示例:

本节中的代码以及显示的标签或输出仍为英文。

import pandas as pd

scores = pd.Series([82, 91], index=["Mia", "Noah"], name="score")
values = scores.to_numpy()
print(values)
print(values.dtype)
[82 91]
int64

数组按 Series 中的顺序包含各个值,不包含 "Mia" 或 "Noah";这些标签仍保存在 scores.index 中。将值传给 NumPy 运算时,这一区别很重要:运算依据位置顺序进行,不会携带 pandas 标签。

需要 pandas 扩展数组时使用 Series.array

如果后续操作需要 pandas 的数组表示形式,请使用 Series.array。根据 Series 中的数据,这种表示形式可能是扩展数组,而不是 NumPy ndarray。对于无法直接映射到常规 NumPy dtype 的数据类型,扩展数组可以保留 pandas 特有的值行为。如果接收方的 API 明确要求 ndarray,请改用 Series.to_numpy()。

例如,表达式 scores.array 会访问 Series 的数组表示形式,而 scores.to_numpy() 会请求 NumPy 表示形式。两者适用于不同的调用方;不要假定 Series.array 的结果是 ndarray,也不要在未确认接口要求前将其传给要求 ndarray 的 API。

使用 Series.values 或 numpy.asarray() 作为兼容的替代方案

Series.values 是获取 Series 值的简洁替代方式,返回类似数组的对象。实际结果可能取决于 Series 的 dtype;如果需要明确执行转换并得到 NumPy ndarray,请使用 Series.to_numpy()。numpy.asarray(scores) 也是从 Series 获取数组的一种兼容方式,适用于已经接受类似数组输入的 NumPy 代码。

这些方式处理的都是 Series 的值,而不是标签。应根据接收结果的代码所要求的接口来选择:需要明确转换为 ndarray 时使用 Series.to_numpy(),需要 pandas 的数组表示形式时使用 Series.array,周边代码适用时则可使用 Series.values 或 numpy.asarray()。这些方式都不会把索引转换为值数组的一部分。

检查数组结果,并分别处理索引和 dtype

如果 dtype 会影响后续计算或存储,请检查转换结果。数值型 Series 通常会得到数值型 NumPy dtype;由 pandas 特有类型或混合值表示的数据,可能需要不同的 NumPy 表示形式。请检查 values.dtype 以了解当前数据的实际结果,不要假设每个 Series 都会转换成同一种数组。由于提供的任务证据不足以支持针对 Series 的版本说明,这里不介绍可选的 dtype 或 copy 控制参数。

如果还需要标签,请单独访问 scores.index,并在程序中明确保持标签与值之间的对应关系。只转换值后,后续 NumPy 运算不会再按标签对齐。这通常符合数值处理的需要,但如果要合并多个 Series 的值,应先确认它们的顺序一致。Series 转换为数组时,不会替你根据标签对齐多个 Series。