如何使用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
相关产品推荐
相关产品推荐

