Python loadtxt 和 genfromtxt 截断字符串

标签 python string numpy truncated genfromtxt

我有一个 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/

相关文章:

python - 在 Debian Wheezy 上使用 flask-sqlalchemy 怪异的内存使用和泄漏

python - 在 Excel 中包含 Python 代码?

java - 删除无关前导数字的最简单方法是什么?

python - 标量/数组乘法返回任意类型

python - 在 panda 数据框中创建新列

Python print() 函数不重新计算 while 循环中的变量

c++ - 找出最长的没有重复字符的子串

Android SharedPreferences一键多值

pandas - 如何计算numpy中一维数组的移动(或滚动,如果你愿意)百分位数/分位数?

python - 使用 Pandas 将列添加到数据透视表