python: numpy: - Verkettung der Namen-arrays
Betrachten Sie das folgende einfache Beispiel:
x = numpy.array([(1,2),(3,4)],dtype=[('a','<f4'),('b','<f4')])
y = numpy.array([(1,2),(3,4)],dtype=[('c','<f4'),('d','<f4')])
numpy.hstack((x,y))
Wird die folgende Fehlermeldung erhalten:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python33\lib\site-packages\numpy\core\shape_base.py", line 226, in vstack
return _nx.concatenate(list(map(atleast_2d,tup)),0)
TypeError: invalid type promotion
Wenn das array hatte keine Titel, es funktioniert
x = numpy.array([(1,2),(3,4)],dtype='<f4')
y = numpy.array([(1,2),(3,4)],dtype='<f4')
numpy.hstack((x,y))
Wenn ich Entferne die Namen aus x-und y-es funktioniert auch.
Frage: wie verketten, vstack oder hstack der Titel numpy-array ?
Hinweis: numpy.lib.recfunctions.stack_arrays funktioniert nicht gut, entweder
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass die Typen unterschiedlich sind. Der "Titel" ist Bestandteil der Art und
y
verwendet verschiedene Namen vonx
, also die Typen sind nicht kompatibel. Wenn Sie mit kompatiblen Typen, alles funktioniert einwandfrei:Manchmal
dstack
usw. sind schlau genug, zu zwingen, Typen in einer vernünftigen Weise, abernumpy
hat keine Möglichkeit zu wissen, wie man kombinieren Datensatz-arrays mit verschiedenen benutzerdefinierten Feldnamen.Wenn Sie möchten, verketten Sie die Datentypen, dann müssen Sie erstellen Sie einen neuen Datentyp. Machen Sie nicht den Fehler zu denken, dass die Reihenfolge von Namen (
x['a']
,x['b']
...) stellt eine echte dimension des Arrays;x
undy
oben 1-d-arrays von Blöcken von Speicher, von denen jede enthält zwei 32-bit-floats zugreifen können, die mit dem Namen'a'
und'b'
. Aber wie Sie sehen können, wenn Sie Zugriff auf ein einzelnes Element im array, Sie nicht bekommen, ein anderes array als würden Sie, wenn es wirklich eine zweite dimension. Den Unterschied sehen Sie hier:Dies ist, was ermöglicht die Datensatz-arrays enthalten heterogene Daten; Datensatz-arrays enthalten kann sowohl strings und ints, aber der trade-off ist, dass Sie nicht die volle Leistung ein
ndarray
auf der Ebene der einzelnen Datensätze.Das Ergebnis ist, dass beitreten einzelne Blöcke von Speicher, die Sie tatsächlich ändern müssen, um die
dtype
des Arrays. Es gibt ein paar Möglichkeiten, dies zu tun, aber die einfachste die ich finden konnte, betrifft die wenig bekanntenumpy.lib.recfunctions
Bibliothek (die ich sehe hast du schon gefunden!!!):x
undy
2-d-arrays. Sie sind es nicht. Siehe meine edits oben.