Extrahieren bestimmter Spalten in einem Numpy-Array


163

Dies ist eine einfache Frage, aber ich habe eine MxN-Matrix. Ich möchte nur bestimmte Spalten extrahieren und in einem anderen Numpy-Array speichern, erhalte jedoch ungültige Syntaxfehler. Hier ist der Code:

extractedData = data[[:,1],[:,9]]. 

Es scheint, als ob die obige Zeile ausreichen sollte, aber ich denke nicht. Ich habe mich umgesehen, konnte aber in Bezug auf dieses spezielle Szenario keine Syntax finden.

Antworten:


271

Ich nehme an, Sie wollten Spalten 1und 9? Das ist

data[:, [1, 9]]

Oder mit Namen:

data[:, ['Column Name1','Column Name2']]

Sie können die Namen von erhalten data.dtype.names...


Wie geht das mit Spaltennamen?
Zelphir Kaltstahl

9
Daten [:, ['Spaltenname1', 'Spaltenname2']]
Code-Attentäter

ist es eine Ansicht oder eine Kopie? Mein Engpass ist in dieser Zeile Ich suche Weg zu optimieren
Fractale

1
Könnte es sein, dass diese Funktion nicht mehr funktioniert?
PV8

Wie heißt diese Syntax?
Burrito

29

Angenommen, Sie möchten die Spalten 1 und 9 mit diesem Codeausschnitt erhalten, sollte dies sein:

extractedData = data[:,[1,9]]

14

Wenn Sie nur einige Spalten extrahieren möchten:

idx_IN_columns = [1, 9]
extractedData = data[:,idx_IN_columns]

Wenn Sie bestimmte Spalten ausschließen möchten:

idx_OUT_columns = [1, 9]
idx_IN_columns = [i for i in xrange(np.shape(data)[1]) if i not in idx_OUT_columns]
extractedData = data[:,idx_IN_columns]

9

Eine Sache, auf die ich hinweisen möchte, ist, dass wenn die Anzahl der Spalten, die Sie extrahieren möchten, 1 ist, die resultierende Matrix keine Mx1-Matrix wäre wie erwartet sondern ein Array, das die Elemente der von Ihnen extrahierten Spalte enthält.

Um es in Matrix zu konvertieren, sollte die Reshape- Methode (M, 1) für das resultierende Array verwendet werden.


2
Sie können dies auch erreichen, indem Sie beispielsweise einen Doppelpunkt verwenden data[:, 8:9]. Dies dauert die achte Spalte, entfernt jedoch nicht die zusätzliche Dimension.
Jan Kukacka

data [:, 8]
wählt

5

Gerade:

>>> m = np.matrix(np.random.random((5, 5)))
>>> m
matrix([[0.91074101, 0.65999332, 0.69774588, 0.007355  , 0.33025395],
        [0.11078742, 0.67463754, 0.43158254, 0.95367876, 0.85926405],
        [0.98665185, 0.86431513, 0.12153138, 0.73006437, 0.13404811],
        [0.24602225, 0.66139215, 0.08400288, 0.56769924, 0.47974697],
        [0.25345299, 0.76385882, 0.11002419, 0.2509888 , 0.06312359]])
>>> m[:,[1, 2]]
matrix([[0.65999332, 0.69774588],
        [0.67463754, 0.43158254],
        [0.86431513, 0.12153138],
        [0.66139215, 0.08400288],
        [0.76385882, 0.11002419]])

Die Spalten müssen nicht in der richtigen Reihenfolge sein:

>>> m[:,[2, 1, 3]]
matrix([[0.69774588, 0.65999332, 0.007355  ],
        [0.43158254, 0.67463754, 0.95367876],
        [0.12153138, 0.86431513, 0.73006437],
        [0.08400288, 0.66139215, 0.56769924],
        [0.11002419, 0.76385882, 0.2509888 ]])

2

Eine weitere Sache, die Sie beachten sollten, wenn Sie Spalten aus dem ND-Array mithilfe einer Liste wie dieser auswählen:

data[:,:,[1,9]]

Wenn Sie eine Dimension entfernen (indem Sie beispielsweise nur eine Zeile auswählen), wird das resultierende Array (aus irgendeinem Grund) permutiert . So:

print data.shape            # gives [10,20,30]
selection = data[1,:,[1,9]]
print selection.shape       # gives [2,20] instead of [20,2]!!

1

Sie können verwenden:

extracted_data = data.ix[:,['Column1','Column2']]


2
Eine gute Antwort wird immer eine Erklärung darüber enthalten, was getan wurde und warum es so getan wurde, nicht nur für das OP, sondern auch für zukünftige Besucher von SO. Bitte fügen Sie eine Beschreibung hinzu, damit andere sie verstehen.
Rucha Bhatt Joshi

-1

Ich denke, die Lösung hier funktioniert nicht mehr mit einem Update der Python-Version. Eine Möglichkeit, dies mit einer neuen Python-Funktion zu tun, ist:

extracted_data = data[['Column Name1','Column Name2']].to_numpy()

das gibt Ihnen das gewünschte Ergebnis.

Die Dokumentation finden Sie hier: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_numpy.html#pandas.DataFrame.to_numpy


Die Frage beginnt mit einem numpy Array, nicht einem Datenrahmen
TMrtSmith

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.