2

我有一个 2 列数组混合类型数组,我需要将其读入并重塑为数据立方体。我已经完成了大部分工作,但由于某种原因,numpy.loadtxt 和 np.genfromtxt 都删除了元组字符串部分第 8 个字符之后的所有内容。我有 8 个参数值对的 25 个块,对应于不同质量和金属丰度的恒星。例如,Teff \t\t 5.2739E+3(字符串和浮点数之间有 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 为什么字符串中的最后一个字符会脱落?我尝试将分隔符设置为仅制表符,仅制表符和换行符(似乎不喜欢那样),注释掉块之间的行等。似乎无论我做什么,每个字符串的字符限制都被卡住了在 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)
4

1 回答 1

1

当字段的数据类型指定为str时,看起来分配给字段的默认大小genfromtxt是 8 个字符。如果您知道最大字符数是 12 个,您可以使用dtype=['S12', float]. (请注意,我使用的是列表,而不是元组。)您也可以使用dtype=None,它告诉您genfromtxt从文件中找到的每个字段的数据类型中找出。

于 2014-09-10T04:31:15.237 回答