2016-06-01 7 views
-3

Diese Frage hat viele Antworten (siehe Python Math - TypeError: 'NoneType' object is not subscriptable). Meine Frage ist anders, weil ich korrekt np.genfromtxt(...) erwarte, ein Array zurückzugeben (d. H. np.genfromtxt(...) ist keine In-Place-Funktion).'NoneType' Objekt ist nicht untergruppierbar - mit `np.fromregex`

Ich versuche, die folgende in ein eindimensionales Array zu analysieren und zu speichern:

http://pastie.org/10860707#2-3

Dazu habe ich versucht:

pattern = re.compile(b'[\s,]') 
theta = np.fromregex("RegLogTheta", regexp = pattern, dtype = float) 

Dies ist die Rückverfolgung ist (wie sollte es formatiert sein?):

Traceback (most recent call last): 
File "/Users/ahanagrawal/Documents/Java/MachL/Chap3/ExamScoreVisual2.py", line 36, in <module> 
theta = np.fromregex("RegLogTheta", regexp = pattern, dtype = float) 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/numpy/lib/npyio.py", line 1240, in fromregex 
newdtype = np.dtype(dtype[dtype.names[0]]) 
TypeError: 'NoneType' object is not subscriptable 

Wenn Sie möchten Führen Sie das aus, laden Sie die Textdatei bitte herunter: http://pastie.org/10860707#2-3 und führen Sie den obigen Code aus.

+1

Bitte buchen Sie die vollständige Traceback. – kindall

+1

Sie verwenden nicht einmal 'np.genfromtxt' in Ihrem geposteten Code. – user2357112

+0

Bitte veröffentlichen Sie keine Daten auf externen Websites. Kopiere es in deine Frage. – MattDMo

Antwort

1

Die Datei hat mehrere Zeilen mit Komma Trennung, 3 Zahlen perline, mit Ausnahme der letzten nur 2

In [182]: fname='../Downloads/pastie-10860707.txt' 

In [183]: np.fromregex(fname,regexp=pattern,dtype=float) 
... 
np.fromregex(fname,regexp=pattern,dtype=float) 

/usr/lib/python3/dist-packages/numpy/lib/npyio.py in fromregex(file, regexp, dtype) 
    1240    # Create the new array as a single data-type and then 
    1241    # re-interpret as a single-field structured array. 
-> 1242    newdtype = np.dtype(dtype[dtype.names[0]]) 
    1243    output = np.array(seq, dtype=newdtype) 
    1244    output.dtype = dtype 

TypeError: 'NoneType' object is not subscriptable 

Geladen mit einem einfachen 'br' gelesen hat, wird die Datei wie folgt aussieht:

In [184]: txt 
Out[184]: b'2.75386225e+00,1.80508078e+00,2.95729122e+00,\n-4.21413726e+00, -3.38139076e+00, -4.22751379e+00,\n ...  4.23010784e-01, -1.14839331e+00, -9.56098910e-01,\n  -1.15019836e+00, 1.13845303e-06' 

Diese fehlende Nummer in der letzten Zeile wird genfromtxt Probleme geben.

Ihre Wahl des Musters ist falsch. Es sieht wie ein Trennzeichenmuster aus. Aber das Muster in fromregex docs produziert Gruppen:

regexp = r"(\\d+)\\s+(...)" 

fromregex tut

seq = regexp.findall(file.read()) # read whole file and group it 
output = np.array(seq, dtype=dtype) # make array from seq 

Wenn Sie fromregex verwenden wollen, müssen Sie mit einem Muster zu entwickeln, die eine Liste von Tupeln erzeugt, die gedreht werden kann, in ein Array direkt.

================

Obwohl die Suche wieder auf dem Fehler messsage ich sehe, dass das unmittelbare Problem mit den dtype ist. dtype=float ist keine gültige Dtypspezifikation für diese Funktion. Es erwartet einen zusammengesetzten dtype (strukturiert).

Der Fehler wird durch diese Aktion erzeugt, wo float Ihre dtype Parameter sind:

In [189]: np.dtype(float).names[0] 
... 
TypeError: 'NoneType' object is not subscriptable 

Aber es versucht, dies zu tun, weil das Muster

In [194]: pattern.findall(txt) 
Out[194]: 
[b',', 
b',', 
b',', 
b'\n', 
b',', 
b' ', 
b' ', 
....] 

nicht die Liste von Tupeln erzeugt hat, das es erwartet.

==================

ich die Datei mit

In [213]: np.genfromtxt(txt.splitlines(),delimiter=',',usecols=[0,1]) 
Out[213]: 
array([[ 2.75386225e+00, 1.80508078e+00], 
     [ -4.21413726e+00, -3.38139076e+00], 
     [ 7.46991792e-01, -1.08010066e+00], 
     ... 
     [ 4.23010784e-01, -1.14839331e+00], 
     [ -1.15019836e+00, 1.13845303e-06]]) 

laden kann ich usecols bin mit vorübergehend, um das Problem zu bekommen mit nur 2 Nummern in der letzten Zeile.

Wenn ich die \n entfernen und es in Kommas aufteilen, kann ich die resultierenden Textfelder direkt mit np.array analysieren.

In [231]: txt1=txt.replace(b'\n',b'').split(b',') 

In [232]: np.array(txt1,float) 
Out[232]: 
array([ 2.75386225e+00, 1.80508078e+00, 2.95729122e+00, 
     -4.21413726e+00, -3.38139076e+00, -4.22751379e+00, 
      ... 
     4.23010784e-01, -1.14839331e+00, -9.56098910e-01, 
     -1.15019836e+00, 1.13845303e-06]) 

Dieses Muster enthält die dezimale und wissenschaftliche Notation:

In [266]: pattern=re.compile(br"(\d+\.\d+e[\+\-]\d+)") 

In [267]: np.fromregex(fname,regexp=pattern,dtype=np.dtype([('f0',float)]))['f0'] 
Out[267]: 
array([ 2.75386225e+00, 1.80508078e+00, 2.95729122e+00, 
     4.21413726e+00, 3.38139076e+00, 4.22751379e+00, 
     ... 
     4.23010784e-01, 1.14839331e+00, 9.56098910e-01, 
     1.15019836e+00, 1.13845303e-06]) 

Vorerst Ich bin ein strukturiertes Array zu schaffen und dieses Feld zu extrahieren. Vielleicht gibt es einen Weg dahin. Aber fromregex scheint die Verwendung von strukturierten dtypes zu bevorzugen.

+0

Soll das eine Antwort sein? –

+0

Es ist zu lang, um ein Kommentar zu sein! Außerdem bist du mit deiner Frage eingesprungen, bevor ich mit der Bearbeitung fertig bin. Ich bin immer noch nicht fertig mit der Bearbeitung. – hpaulj

+0

@hpaulj Ich denke, das folgende sollte funktionieren: 'Theta = np.fromregex (" RegLogTheta ", regexp = r" \ s +, (\ d +) \ s + ", dtype = [(np.float128)])'. Das einzige Problem ist, dass [(np.float128)] kein anerkannter dtyp ist, was ich nicht verstehe. – Muno

Verwandte Themen