You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用NumPy根据数据类型创建列子集?以<float64筛选为例

根据数据类型筛选NumPy结构化数组的列子集

要从NumPy的结构化数组(比如df.to_records()生成的rec.array)中根据数据类型筛选列,核心思路是先识别出符合目标类型的字段名,再用这些字段名索引数组得到子集。下面针对你的示例一步步说明:

基础实现:精确匹配dtype字符串

首先,先还原你的示例场景:

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [1, 2], 'B': [0.5, 0.75]}, index=['a', 'b'])
arr = df.to_records()

筛选<f8>(float64)类型的列

我们可以遍历数组的dtype.descr属性(它返回一个列表,每个元素是(字段名, dtype字符串)的元组),筛选出符合条件的字段名,再用这些字段名索引数组:

# 提取所有dtype为'<f8'的字段名
float_field_names = [field_name for field_name, dtype_str in arr.dtype.descr if dtype_str == '<f8']
# 生成仅包含目标字段的子集数组
float_subset = arr[float_field_names]

# 输出结果
print(float_subset)
# rec.array([(0.5 ), (0.75)], dtype=[('B', '<f8')])

排除<i8>(int64)类型的列

如果要排除指定类型的列,只需要调整判断条件即可:

# 排除dtype为'<i8'的字段名
non_int_field_names = [field_name for field_name, dtype_str in arr.dtype.descr if dtype_str != '<i8']
non_int_subset = arr[non_int_field_names]

print(non_int_subset)
# rec.array([('a', 0.5 ), ('b', 0.75)], dtype=[('index', 'O'), ('B', '<f8')])

更通用的类型判断(兼容不同字节序)

如果你的数组可能存在不同字节序的同类型数据(比如>f8表示大端字节序的float64),可以用np.issubdtype来判断字段类型是否属于某个大类(比如浮点型、整型),这样更鲁棒:

# 筛选所有浮点类型的字段,不管字节序
float_field_names = [
    field_name 
    for field_name, (field_dtype, _) in arr.dtype.fields.items() 
    if np.issubdtype(field_dtype, np.floating)
]
float_subset = arr[float_field_names]

同理,筛选整型字段可以用np.integer代替np.floating。

解释为什么你的初始思路行不通

你提到想使用np.where(my_np_array.dtype==[('int64')]),但这个方法无效的原因是:结构化数组的dtype是一个复合类型,不是单一的标量dtype,直接用等于判断无法匹配到单个字段的类型。必须遍历每个字段的dtype信息,才能完成筛选。

内容的提问来源于stack exchange,提问作者Student

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:56:17