2016-10-09 3 views
2

Ich habe eine einfache Textdatei (.txt) mit dem folgenden Inhalt.Wie bekomme ich ein numpy ndarray von Ganzzahlen aus einer Datei mit Header?

Matrix Header. 
6 11 
0 1 1 1 1 1 1 1 1 1 1 
1 0 1 1 1 1 0 1 1 1 1 
1 1 1 1 0 0 1 1 1 1 1 
0 0 0 0 1 1 1 0 0 0 0 
1 1 1 0 0 1 1 1 1 1 1 
1 0 0 1 1 1 1 0 1 1 0 

6 rows, 11 columns 

Ich brauche eine numpy ndarray von ganzen Zahlen zu erhalten, wie unten:

[[0 1 1 1 1 1 1 1 1 1 1] 
[1 0 1 1 1 1 0 1 1 1 1] 
[1 1 1 1 0 0 1 1 1 1 1] 
[0 0 0 0 1 1 1 0 0 0 0] 
[1 1 1 0 0 1 1 1 1 1 1] 
[1 0 0 1 1 1 1 0 1 1 0]] 

ich die folgende Strategie versucht

import pandas 
import numpy 
data = pandas.read_table(path, skiprows= 2) 
data = data.values 
print(data) 

Aber die resultierende ndarray ist nicht im richtigen Format.

[['0 1 1 1 1 1 1 1 1 1 1 '] 
['1 0 1 1 1 1 0 1 1 1 1 '] 
['1 1 1 1 0 0 1 1 1 1 1 '] 
['0 0 0 0 1 1 1 0 0 0 0 '] 
['1 1 1 0 0 1 1 1 1 1 1 '] 
['1 0 0 1 1 1 1 0 1 1 0 ']] 

Kann mir jemand helfen?

+0

Sie müssen 'sep =‘ ‚' 'in read_table verwenden () '. Sie können auch direkt 'numpy.load_txt()' verwenden. – Julien

+0

Enthält Ihre Eingabedatei tatsächlich den Text '6 Zeilen, 11 Spalten' unten? –

+0

Funktioniert gut, danke @JulienBernu. Haben Sie Vorschläge für eine elegantere und effizientere Umsetzung? – HarpMan

Antwort

1

Um den Fehler zu vermeiden, der aufgrund des Textes am Ende auftreten könnte, können Sie numpy.genfromtxt mit dem Argument max_rows verwenden. Zum Beispiel

In [26]: with open(filename, 'rb') as f: 
    ...:  f.readline() # skip the header 
    ...:  nrows, ncols = [int(field) for field in f.readline().split()] 
    ...:  data = np.genfromtxt(f, dtype=int, max_rows=nrows) 
    ...:  

In [27]: data 
Out[27]: 
array([[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
     [1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1], 
     [1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1], 
     [0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0], 
     [1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1], 
     [1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0]]) 

(öffnete ich die Datei im Binärmodus ein Byte/str Problem zu vermeiden, dass genfromtxt in Python 3 hat)

+0

Danke Warren. Ausgezeichnete Lösung. – HarpMan

1

Eine einfache Lösung ist ausdrücklich um die Linien zu ignorieren Sie nicht brauchen:

with open(path) as infile: 
    lines = infile.readlines() 
np.loadtxt(lines[2:-2]) 
del lines # if you want to immediately release the memory 

Diese Sie direkt gibt, was Sie wollen, vorausgesetzt, die Kopf- und Fußzeile sind immer zwei Zeilen je.

+0

Danke John, funktioniert gut. – HarpMan

Verwandte Themen