我有一个 2 列数组混合类型数组,我需要将其读入并 reshape 为数据立方体。我已经完成了大部分工作,但出于某种原因,numpy.loadtxt 和 np.genfromtxt 都删除了元组字符串部分第 8 个字符之后的所有内容。我有 25 个 block ,每组 8 个参数值对,对应于不同质量和金属丰度的恒星。例如,Teff \t\t 5.2739E+3
(字符串和 float 之间有 2 个制表符)可以很好地转换为键值对,但是 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
为什么字符串中的最后一个字符会脱落?
我已经尝试将分隔符设置为仅制表符,仅制表符和换行符(似乎不喜欢那样),注释掉 block 之间的线等。似乎无论我做什么,每个字符串的字符限制都被卡住了在 8. 必须有一个字符串子类型我需要声明。我已经做了一个解决方法,它只是困扰着我。
这是我的代码(顺便说一句,我使用的是 Spyder GUI):
>>>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)
最佳答案
当一个字段的数据类型指定为str
时,看起来genfromtxt
分配给该字段的默认大小是八个字符。如果您知道最大字符数为 12,则可以使用 dtype=['S12', float]
。 (请注意,我使用的是列表,而不是元组。)您还可以使用 dtype=None
,它告诉 genfromtxt
从中找出每个字段的数据类型它在文件中找到了什么。
关于Python loadtxt 和 genfromtxt 截断字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25756472/