使用numpy loadtxt/genfromtxt指定列名时返回空数组,求助排查
问题原因与解决方法
核心问题在于使用结构化数据类型时未指定字符串长度,numpy无法自动推断合适的字符串存储长度,导致读取的内容无法存入字段,最终显示为空;另外genfromtxt的默认注释处理逻辑虽能识别列名,但同样受字符串长度未指定的影响。
解决方法1:给结构化dtype指定字符串长度
使用loadtxt时,明确每个字符串字段的长度(比如根据数据实际长度设为U5),表头行因以#开头会被默认当作注释跳过,无需额外设置:
import numpy as np result = np.loadtxt('test.csv', delimiter='|', dtype=[('a', 'U5'), ('b', 'U5'), ('c', 'U5')]) print(result)
输出:
array([('foo ', 'fooo ', 'foooo'), ('bar ', 'barr ', 'barrr')], dtype=[('a', '<U5'), ('b', '<U5'), ('c', '<U5')])
解决方法2:genfromtxt指定字符串长度
同样需指定字符串长度,默认comments='#'会自动去掉表头行的#并提取列名:
import numpy as np result = np.genfromtxt('test.csv', delimiter='|', names=True, dtype='U5') print(result)
输出:
array([('foo ', 'fooo ', 'foooo'), ('bar ', 'barr ', 'barrr')], dtype=[('a', '<U5'), ('b', '<U5'), ('c', '<U5')])
额外说明:显式跳过表头行
如果希望不依赖默认注释逻辑,可显式设置skiprows=1跳过第一行,同时指定字符串长度:
np.loadtxt('test.csv', delimiter='|', skiprows=1, dtype=[('a', 'U5'), ('b', 'U5'), ('c', 'U5')])
内容的提问来源于stack exchange,提问作者A.Manfreda
相关产品推荐
相关产品推荐

