2017-01-12 13 views
1

Ich habe so Stück Code, wo ich versuche zu laden vier Spalten aus csv DateiWie Sie sich richtig numpy dtype

import numpy as np 
rtype = np.dtype([('1', np.float), ('2', np.float), ('3', np.float), ('tier', np.str, 32)]) 
x1, x2, x3, x4 = np.genfromtxt("../Data/out.txt", dtype=rtype, skip_header=1, delimiter=",", usecols=(3, 4, 5, 6), unpack=True) 

Aber ich habe einen Fehler definieren:

ValueError: too many values to unpack (expected 4) 

Dies ist eine beleuchtete etwas seltsam, weil ich vier Variablen habe und vier Spalten laden.

Wie werden sie korrekt geladen? IMHO, Problem ist in np.dtype, denn ohne es funktioniert alles gut (mit anderen Arten obwohl). Ich benutze Python3.

+0

Was ist der 'dtype' von' x4', wenn es richtig geladen wird? Was macht 'dtype = None'? – hpaulj

+0

'unpack = True' funktioniert nicht mit' dtype = None': https://github.com/numpy/numpy/issues/4341 –

Antwort

2

Sieht aus wie Sie einen Text wie haben:

In [447]: txt=b"""1.2 3.3 2.0 str 
    ...: 3.3 3.3 2.2 astring 
    ...: """ 

Meine erste Wahl ist genfromtxt mit dtype=None (automatischer dtype Bestimmung):

In [448]: np.genfromtxt(txt.splitlines(),dtype=None) 
Out[448]: 
array([(1.2, 3.3, 2.0, b'str'), (3.3, 3.3, 2.2, b'astring')], 
     dtype=[('f0', '<f8'), ('f1', '<f8'), ('f2', '<f8'), ('f3', 'S7')]) 

Ohne dtype versucht es allen Schwimmer zu machen - einschließlich der String-Spalte:

In [449]: np.genfromtxt(txt.splitlines()) 
Out[449]: 
array([[ 1.2, 3.3, 2. , nan], 
     [ 3.3, 3.3, 2.2, nan]]) 

Ich verwende unpack nicht viel, sondern bevorzuge ein 2d oder strukturiertes Array. Aber mit auspacken:

In [450]: x1,x2,x3,x4=np.genfromtxt(txt.splitlines(),unpack=True) 
In [451]: x1 
Out[451]: array([ 1.2, 3.3]) 
In [452]: x4 
Out[452]: array([ nan, nan]) 

Ich bekomme immer noch die nan für die String-Spalte.

Borrowing die dtype vom dtype=None Fall:

In [456]: dt=np.dtype([('f0', '<f8'), ('f1', '<f8'), ('f2', '<f8'), ('f3', 'S7')]) 
In [457]: dt 
Out[457]: dtype([('f0', '<f8'), ('f1', '<f8'), ('f2', '<f8'), ('f3', 'S7')]) 
In [458]: np.genfromtxt(txt.splitlines(),unpack=True,dtype=dt) 
Out[458]: 
array([(1.2, 3.3, 2.0, b'str'), (3.3, 3.3, 2.2, b'astring')], 
     dtype=[('f0', '<f8'), ('f1', '<f8'), ('f2', '<f8'), ('f3', 'S7')]) 
In [459]: _.shape 
Out[459]: (2,) 

Mit dieser Verbindung dtype, unpack gibt mir ein Stück pro Zeile des Textes, nicht ein Stück pro Spalte. Mit anderen Worten, unpack teilt die strukturierten Felder nicht auf.

Eine Möglichkeit, die String-Spalte zu handhaben und noch auspacken zu verwenden ist, den Text zu lesen, zweimal:

erste Last der Schwimmer Spalten:

In [462]: x1,x2,x3=np.genfromtxt(txt.splitlines(),unpack=True,usecols=[0,1,2]) 
In [463]: x3 
Out[463]: array([ 2. , 2.2]) 

dann die String-Spalte laden, mit dtype=None oder S32:

In [466]: x4=np.genfromtxt(txt.splitlines(),unpack=True,usecols=[3],dtype=None) 
In [467]: x4 
Out[467]: 
array([b'str', b'astring'], 
     dtype='|S7') 

Eine weitere Option ist die strukturierte Anordnung zu laden, und entpacken die Felder einzeln

In [468]: data = np.genfromtxt(txt.splitlines(),dtype=None) 
In [469]: data.dtype 
Out[469]: dtype([('f0', '<f8'), ('f1', '<f8'), ('f2', '<f8'), ('f3', 'S7')]) 
In [470]: x1, x2, x3 = data['f0'],data['f1'],data['f2'] 
In [471]: x4 = data['f3'] 
In [472]: x4 
Out[472]: 
array([b'str', b'astring'], 
     dtype='|S7') 

Der sicherste Weg, genfromtxt zu verwenden ist

data = np.genfromtxt(...) 
print(data.shape) 
print(data.dtype) 

und dann, bevor sie stellen Sie sicher, dass die Form und dtype verstehen die data Array zu verwenden.

Verwandte Themen