2016-08-27 2 views
0

Ich versuche, Text aus einer flachen Datei zu importieren und in float-Werte innerhalb einer einzigen Zeile zu konvertieren. Ich habe gesehen this post, die den gleichen Fehler hat, aber ich habe nicht gefunden, welche Zeichen in meiner Eingabedatei ungültig sind. Oder habe ich einen Syntaxfehler?Convert import string to float mit numpys loadtext

Import als Zeichenfolge ein Druck das Ergebnis:

data = np.loadtxt(file, delimiter='\t', dtype=str) 
print(data[0:2]) 
... 
[["b'Time'" "b'Percent'"] 
["b'99'" "b'0.067'"]] 

Versuch als Schwimmer zu importieren:

# Import data as floats and skip the first row: data_float 
data_float = np.loadtxt(data, delimiter='\t', dtype=float, skiprows=1) 

Es führt den folgenden Fehler:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    data_float = np.loadtxt(data, delimiter='\t', dtype=float, skiprows=1) 
    File "<stdin>", line 848, in loadtxt 
    items = [conv(val) for (conv, val) in zip(converters, vals)] 
    File "<stdin>", line 848, in <listcomp> 
    items = [conv(val) for (conv, val) in zip(converters, vals)] 
ValueError: could not convert string to float: b'["b\'99\'" "b\'0.067\'"]' 

By the way, Ich habe auch this post gesehen, was den b Charakter erklärt, aber ich denke nicht, dass das t er Problem.

Ein weiterer Schritt zur Fehlerbehebung, wie durch die erste Antwort vorgeschlagen:

data = np.loadtxt(file, delimiter="\tb'", dtype=str) 

Returns:

array(["b'Time\\tPercent'", "b'99\\t0.067'", "b'99\\t0.133'", 
     "b'99\\t0.067'", "b'99\\t0'", "b'99\\t0'", "b'0\\t0.5'", 
     "b'0\\t0.467'", "b'0\\t0.857'", "b'0\\t0.5'", "b'0\\t0.357'", 
     "b'0\\t0.533'", "b'5\\t0.467'", "b'5\\t0.467'", "b'5\\t0.125'", 
     "b'5\\t0.4'", "b'5\\t0.214'", "b'5\\t0.4'", "b'10\\t0.067'", 
     "b'10\\t0.067'", "b'10\\t0.333'", "b'10\\t0.333'", "b'10\\t0.133'", 
     "b'10\\t0.133'", "b'15\\t0.267'", "b'15\\t0.286'", "b'15\\t0.333'", 
     "b'15\\t0.214'", "b'15\\t0'", "b'15\\t0'", "b'20\\t0.267'", 
     "b'20\\t0.2'", "b'20\\t0.267'", "b'20\\t0.437'", "b'20\\t0.077'", 
     "b'20\\t0.067'", "b'25\\t0.133'", "b'25\\t0.267'", "b'25\\t0.412'", 
     "b'25\\t0'", "b'25\\t0.067'", "b'25\\t0.133'", "b'30\\t0'", 
     "b'30\\t0.071'", "b'30\\t0'", "b'30\\t0.067'", "b'30\\t0.067'", 
     "b'30\\t0.133'"], 
     dtype='<U16') 

Antwort

1

Danke an alle, die sich meine Frage angeschaut haben. Ich habe IPython neu gestartet und konnte nun den gleichen Code ohne Probleme ausführen. Hier ist der Code, der funktioniert, der mit dem oben genannten identisch ist.

data_float = np.loadtxt(file, delimiter='\t', dtype=float, skiprows=1) 

Ergebnis:

In [1]: data_float 
Out[1]: 
array([[ 9.90000000e+01, 6.70000000e-02], 
     [ 9.90000000e+01, 1.33000000e-01], 
     [ 9.90000000e+01, 6.70000000e-02], 
     [ 9.90000000e+01, 0.00000000e+00], 
     [ 9.90000000e+01, 0.00000000e+00], 
     [ 0.00000000e+00, 5.00000000e-01], 
     [ 0.00000000e+00, 4.67000000e-01], 
     [ 0.00000000e+00, 8.57000000e-01], 
     [ 0.00000000e+00, 5.00000000e-01], 
     [ 0.00000000e+00, 3.57000000e-01], 
     [ 0.00000000e+00, 5.33000000e-01], 
     [ 5.00000000e+00, 4.67000000e-01], 
     [ 5.00000000e+00, 4.67000000e-01], 
     [ 5.00000000e+00, 1.25000000e-01], 
     [ 5.00000000e+00, 4.00000000e-01], 
     [ 5.00000000e+00, 2.14000000e-01], 
     [ 5.00000000e+00, 4.00000000e-01], 
     [ 1.00000000e+01, 6.70000000e-02], 
     [ 1.00000000e+01, 6.70000000e-02], 
     [ 1.00000000e+01, 3.33000000e-01], 
     [ 1.00000000e+01, 3.33000000e-01], 
     [ 1.00000000e+01, 1.33000000e-01], 
     [ 1.00000000e+01, 1.33000000e-01], 
     [ 1.50000000e+01, 2.67000000e-01], 
     [ 1.50000000e+01, 2.86000000e-01], 
     [ 1.50000000e+01, 3.33000000e-01], 
     [ 1.50000000e+01, 2.14000000e-01], 
     [ 1.50000000e+01, 0.00000000e+00], 
     [ 1.50000000e+01, 0.00000000e+00], 
     [ 2.00000000e+01, 2.67000000e-01], 
     [ 2.00000000e+01, 2.00000000e-01], 
     [ 2.00000000e+01, 2.67000000e-01], 
     [ 2.00000000e+01, 4.37000000e-01], 
     [ 2.00000000e+01, 7.70000000e-02], 
     [ 2.00000000e+01, 6.70000000e-02], 
     [ 2.50000000e+01, 1.33000000e-01], 
     [ 2.50000000e+01, 2.67000000e-01], 
     [ 2.50000000e+01, 4.12000000e-01], 
     [ 2.50000000e+01, 0.00000000e+00], 
     [ 2.50000000e+01, 6.70000000e-02], 
     [ 2.50000000e+01, 1.33000000e-01], 
     [ 3.00000000e+01, 0.00000000e+00], 
     [ 3.00000000e+01, 7.10000000e-02], 
     [ 3.00000000e+01, 0.00000000e+00], 
     [ 3.00000000e+01, 6.70000000e-02], 
     [ 3.00000000e+01, 6.70000000e-02], 
     [ 3.00000000e+01, 1.33000000e-01]]) 
+0

Das war mein Kommentar unten. Ich werde glücklich sein, es zu löschen. Aber könnten Sie erklären, warum zuerst? – Bobby

+0

Ich löste es jetzt, Siehe meine Posted Response. Ich könnte auch die gesamte Frage löschen, da die Antwort trivial war, aber vielleicht hilft es jemandem. – Bobby

+1

Löschen Sie die Frage: es ist off Thema m SO ------ das enge Pop-up. Diese Frage wurde durch ein Problem verursacht, das nicht mehr reproduziert werden kann oder ein einfacher Tippfehler. Während ähnliche Fragen hier zum Thema gehören könnten, wurde diese in einer Weise gelöst, die den zukünftigen Lesern wahrscheinlich nicht hilft. Dies kann oft vermieden werden, indem das kürzeste Programm identifiziert und genau untersucht wird, das zur Reproduktion des Problems vor der Veröffentlichung erforderlich ist. – Merlin

1

Könnten Sie versuchen:

data = np.loadtxt(file, delimiter="\tb'", dtype=str) 

um anzuzeigen, dass die eigentlichen Trennzeichen scheinen die Zeichen "b" einschließen?

+0

Dies funktionierte ohne Fehler, sieht aber nicht richtig aus. Ich werde jetzt zur Frage hinzufügen. – Bobby

+0

>>> Schwimmer (b'42') ist kein Problem, aber was Sie zu tun haben, >>> Schwimmer („b'42' “) ist nicht das Gleiche und Fehler aus mit ValueError: Konnte String in Float nicht konvertieren: "b'18 '" –

+0

Aktualisierte Frage mit der Ausgabe Ihres Vorschlags. – Bobby

1

Das Problem ist, dass Ihre Zahlen notiert sind. Das heißt, das Feld ist '99', anstatt 99. Es gibt zwei Möglichkeiten, wie Sie dies tun können. Sie können Konverterfunktionen bereitstellen, die die Anführungszeichen streichen und einen Gleitkommawert zurückgeben. Oder Sie können das Modul csv verwenden, um Ihre Daten zu laden und diese Daten an numpy weiterzuleiten.

Mit Konverter Funktionen

import numpy as np 
from io import StringIO 

data = """'x'\t'y' 
'1'\t'2.5'""" 

arr = np.loadtxt(StringIO(data), dtype=float, delimiter="\t", skiprows=1, 
    converters=dict.fromkeys([0, 1], (lambda s: float(s.strip(b"'")))) 
) 

Mit csv

import csv 
import numpy as np 
from io import StringIO 

data = """'x'\t'y' 
'1'\t'2.5'""" 

reader = csv.reader(StringIO(data), quotechar="'", delimiter="\t") 
next(reader) # skip headers 
arr = np.array(list(reader), dtype=float) 

In beiden Beispielen Ich habe verwendet StringIO so können Sie ganz einfach den Inhalt der "Datei" sehen. Sie können den Dateinamen oder das Dateiobjekt natürlich an diese Funktionen übergeben.