Python loadtxt 和 genfromtxt 截断字符串
我有一个包含两列的混合类型数组,想把它读入并重新整理成一个数据立方体。大部分功能我已经搞定了,但不知为什么,使用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
自动根据文件里的内容来判断每个字段的数据类型。