Python loadtxt 和 genfromtxt 截断字符串

2 投票
1 回答
1067 浏览
提问于 2025-04-20 19:05

我有一个包含两列的混合类型数组,想把它读入并重新整理成一个数据立方体。大部分功能我已经搞定了,但不知为什么,使用numpy.loadtxt和np.genfromtxt时,字符串部分的元组在第八个字符之后的内容都被丢掉了。我有25组8个参数-值对,分别对应不同质量和金属含量的星星。例如,Teff \t\t 5.2739E+3(字符串和浮点数之间有两个制表符)能正常转换成键值对,但MASS/MSUN \t\t 0.800却变成了'MASS/MSU':0.800,而不是我预期的'MASS/MSUN':0.800。类似地,LOG(L/LSUN) \t\t 0.0522变成了'LOG(L/LS': 0.0522,而不是'LOG(L/LSUN)': 0.0522。为什么字符串的最后几个字符会消失呢?

我尝试过把分隔符设置为只有制表符,或者制表符和换行符(似乎不太喜欢这样),还注释掉了块之间的行等等。无论我怎么做,每个字符串的字符限制似乎都卡在了8个。可能是我需要声明某种字符串子类型。我已经找到了一种变通办法,但这让我很困扰。

这是我的代码(顺便说一下,我在使用Spyder图形界面):

>>>f=np.genfromtxt("zamsdata.txt",dtype=(str,float))
>>>zcube = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
>>>infotups=[]
>>>for row in f:
>>>    if 'MASS' in row[0]:
>>>        mass=str(row[1])
>>>        continue #rows are in repeating order of MASS, X, Y, Pc, Tc, R, L, Te, LOG(Te) & LOG(L/LSUN)
>>>    if 'X' in row[0]:
>>>        hydfrac=str(row[1])
>>>        continue
>>>    else:
>>>        infotups=infotups+[[hydfrac,mass,str(row[0]),row[1]]]
>>>        
>>>for l,m,a,o in infotups:
>>>    zcube[l][m][a].append(o)

1 个回答

1

当你把一个字段的数据类型设定为 str 时,使用 genfromtxt 这个函数时,它默认会给这个字段分配八个字符的大小。如果你知道这个字段最多能有,比如说,12个字符,你可以用 dtype=['S12', float] 来指定。注意,我这里用的是列表,而不是元组。你也可以选择 dtype=None,这样就会让 genfromtxt 自动根据文件里的内容来判断每个字段的数据类型。

撰写回答