使用np.genfromtxt时列顺序与文件不一致导致列赋值错误
numpy.genfromtxt列顺序不一致时的异常问题
我在大型代码中遇到了这个问题,以下是简化后的复现代码:
from io import StringIO import numpy as np example_data = "A B\na b\na b" data1 = np.genfromtxt(StringIO(example_data), usecols=["A", "B"], names=True, dtype=None) print(data1["A"], data1["B"]) # ['a' 'a'] ['b' 'b'] 结果正确 data2 = np.genfromtxt(StringIO(example_data), usecols=["B", "A"], names=True, dtype=None) print(data2["A"], data2["B"]) # ['b' 'b'] ['a' 'a'] 结果不符合预期
可以看到,当usecols传入的列顺序和文件中的列顺序不一致时,得到的结果不符合预期,但两者的dtype是一致的:
print(data1.dtype) # [('A', '<U1'), ('B', '<U1')] print(data2.dtype) # [('A', '<U1'), ('B', '<U1')]
这个示例里可以预先排序列名,但我的场景中列名来自系统其他模块,无法保证和文件列顺序一致。我可以规避这个问题,但想确认这是逻辑错误还是函数bug。
更新:
测试发现,如果示例数据中新增一列或多列,仅传入子集列时,无论列顺序如何,结果均正确:
example_data = "A B C\na b c\na b c" data1 = np.genfromtxt(StringIO(example_data), usecols=["A", "B"], names=True, dtype=None) print(data1["A"], data1["B"]) # ['a' 'a'] ['b' 'b'] 结果正确 data2 = np.genfromtxt(StringIO(example_data), usecols=["B", "A"], names=True, dtype=None) print(data2["A"], data2["B"]) # ['a' 'a'] ['b' 'b'] 结果正确
内容的提问来源于stack exchange,提问作者Milos Stojanovic
相关产品推荐
相关产品推荐

