2014-09-10 1 views
1

J'ai un tableau de type tableau mixte à 2 colonnes que j'ai besoin de lire et de remodeler en un cube de données. J'ai la plupart de travail, mais pour une raison quelconque à la fois numpy.loadtxt et np.genfromtxt laisser tomber tout après le 8ème caractère de la partie de la chaîne du tuple. J'ai 25 blocs de 8 paires de paramètres-valeurs correspondant à des étoiles de masses et de métallités variables. Par exemple, Teff \t\t 5.2739E+3 (il y a 2 onglets entre la chaîne et le flotteur) convertit en une paire clé-valeur très bien, mais MASS/MSUN \t\t 0.800 est converti en 'MASS/MSU':0.800 au lieu de 'MASS/MSUN':0.800 comme je m'y attendais. De même, LOG(L/LSUN) \t\t 0.0522 devient 'LOG(L/LS': 0.0522 au lieu de 'LOG(L/LSUN)': 0.0522 Pourquoi les derniers caractères des chaînes tombent-ils? J'ai essayé de régler les délimiteurs uniquement sur les onglets, seulement les onglets et les retours à la ligne (cela n'a pas plu), j'ai mis en commentaire les lignes entre les blocs, etc. coincé à 8. Il doit y avoir un sous-type de chaîne que je dois déclarer. J'ai fait une solution de contournement, ça me dérange.Chaînes tronquées Python loadtxt et genfromtxt

Ceci est mon code (j'utilise l'interface graphique Spyder, BTW):

>>>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

bonne question, il serait encore mieux si vous pouviez inclure un exemple des données d'entrée et la sortie attendue ... –

+1

J'avais espéré que ce serait auto-explicatif que l'entrée est en cours de conversion verbatim d'un tuple à une paire clé/valeur, mais je suppose que ça ne fait jamais de mal d'ajouter une clarification supplémentaire. – ColorOutOfSpace

Répondre

1

Lorsque le type de données d'un champ est spécifié comme str, il ressemble à la taille par défaut affectée au champ par genfromtxt est de huit caractères. Si vous savez que le nombre maximum de caractères est, disons, 12, vous pouvez utiliser dtype=['S12', float]. (Notez que j'ai utilisé une liste, pas un tuple.) Vous pouvez également utiliser dtype=None, qui indique genfromtxt pour déterminer le type de données de chaque champ à partir de ce qu'il trouve dans le fichier.

+0

Paramètre dtype = Aucun tronqué les chaînes de la même manière, mais votre première suggestion a fonctionné comme un charme! Merci! – ColorOutOfSpace

+0

Heureux que cela a fonctionné pour vous. Utilisez 'dtype = None' travaillé pour moi avec un fichier contenant 25 lignes, avec une colonne de chaîne et une colonne à virgule flottante, où la longueur maximale d'une chaîne était de 15. J'utilise la version numpy 1.8.2. –

Questions connexes