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.
Was ist der 'dtype' von' x4', wenn es richtig geladen wird? Was macht 'dtype = None'? – hpaulj
'unpack = True' funktioniert nicht mit' dtype = None': https://github.com/numpy/numpy/issues/4341 –