Wie, um wieder eine Ansicht von mehreren Spalten in numpy strukturierte array
Kann ich mehrere Spalten (fields
) auf einmal in einem numpy
strukturierten Arrays durch Indizierung mit einer Liste der Feldnamen, beispielsweise
import numpy as np
a = np.array([(1.5, 2.5, (1.0,2.0)), (3.,4.,(4.,5.)), (1.,3.,(2.,6.))],
dtype=[('x',float), ('y',float), ('value',float,(2,2))])
print a[['x','y']]
#[(1.5, 2.5) (3.0, 4.0) (1.0, 3.0)]
print a[['x','y']].dtype
#[('x', '<f4') ('y', '<f4')])
Aber das problem ist, dass es scheint zu sein, eine Kopie, eher als einen Blick:
b = a[['x','y']]
b[0] = (9.,9.)
print b
#[(9.0, 9.0) (3.0, 4.0) (1.0, 3.0)]
print a[['x','y']]
#[(1.5, 2.5) (3.0, 4.0) (1.0, 3.0)]
Wenn ich nur eine Spalte, es ist eine Ansicht:
c = x['y']
c[0] = 99.
print c
#[ 99. 4. 3. ]
print a['y']
#[ 99. 4. 3. ]
Gibt es eine Möglichkeit, ich kann mit der Ansicht Verhalten für mehr als eine Spalte auf einmal?
Habe ich zwei workarounds, man ist einfach in einer Schleife durch die Spalten, der andere ist das erstellen einer hierarchischen dtype
, so dass die eine Spalte, die tatsächlich gibt, ein strukturiertes array mit den zwei (oder mehr) Felder, die ich will. Leider zip
gibt auch eine Kopie, so kann ich das nicht:
x = a['x']; y = a['y']
z = zip(x,y)
z[0] = (9.,9.)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie erstellen, dtype-Objekt enthält nur die Felder, die Sie möchten, und verwenden Sie
numpy.ndarray()
so erstellen Sie eine Ansicht des original-array:hier ist die Ausgabe:
memoryview
wie datetime64. Siehe github.com/numpy/numpy/issues/4983 für details.Gebäude auf @HYRY Antwort, könnten Sie auch
ndarray
's Methodegetfield
:getfield
scheint nicht zu sein ein neue Methode, obwohl ich es noch nie zuvor gesehen.Ich glaube nicht, dass es einen einfachen Weg, das zu erreichen, was Sie wollen. Im Allgemeinen, Sie können eine beliebige Ansicht in ein array. Versuchen Sie Folgendes:
Float Ansicht Ihrer Datensatz-array zeigt, wie Sie die tatsächlichen Daten, die im Arbeitsspeicher gespeichert wird. Ein Blick in diese Daten zu ausdrückbar ist als eine Kombination aus einer Form, Fortschritte und offset in der oben genannten Daten. Also, wenn Sie wollten, zum Beispiel, einen Blick auf
'x'
und'y'
nur, können Sie das folgende tun:Den
as_strided
macht das gleiche wie das vielleicht einfacher zu verstehen:Entweder ist ein Blick in
a
:Wäre es schön, wenn entweder dieser könnte umgewandelt werden in ein Datensatz-array, aber numpy weigert dies zu tun, ist der Grund nicht ganz klar ist für mich:
Natürlich, was funktioniert (Art) für
'x'
und'y'
würde nicht funktionieren, zum Beispiel für'x'
und'value'
, so dass im Allgemeinen die Antwort ist: es kann nicht getan werden.Als der Numpy-version 1.13, die code, den Sie vorschlagen wird eine Ansicht zurückgeben. Siehe 'NumPy 1.12.0-Release Notes - ->Zukünftige Änderungen->Mehrere Feld-manipulation von strukturierten arrays auf diese Seite:
https://docs.scipy.org/doc/numpy-dev/release.html