Kann jemand eine Spalte aus einem mehrdimensionalen Array in Python extrahieren?Wie extrahieren Sie eine Spalte aus einem mehrdimensionalen Array?
Antwort
Könnte es sein, dass Sie eine NumPy array verwenden? Python hat das Modul array, unterstützt jedoch keine mehrdimensionalen Arrays. Normale Python-Listen sind ebenfalls eindimensional.
Wenn Sie jedoch eine einfache zweidimensionale Liste wie folgt aussehen:
A = [[1,2,3,4],
[5,6,7,8]]
dann können Sie eine Spalte wie folgt extrahieren:
def column(matrix, i):
return [row[i] for row in matrix]
die zweite Spalte Extrahieren (Index 1):
>>> column(A, 1)
[2, 6]
oder alternativ einfach:
Der itemgetter-Operator kann auch helfen, wenn Sie Map-Reduction-Stil Python, anstatt List Comprehensions, für ein wenig Abwechslung!
# tested in 2.4
from operator import itemgetter
def column(matrix,i):
f = itemgetter(i)
return map(f,matrix)
M = [range(x,x+5) for x in range(10)]
assert column(M,1) == range(1,11)
>>> import numpy as np
>>> A = np.array([[1,2,3,4],[5,6,7,8]])
>>> A
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
>>> A[:,2] # returns the third columm
array([3, 7])
Siehe auch: "numpy.arange" und "Umformen" Memory
Beispiel zuzuteilen (a-Array mit Matrix-Formgebung von Allokierung (3x4))
nrows = 3
ncols = 4
my_array = numpy.arange(nrows*ncols, dtype='double')
my_array = my_array.reshape(nrows, ncols)
hat mich 2 Stunden gebraucht, um zu entdecken [:, 2] rate dieses Feature nicht in der offiziellen Slicing-Literatur? – sloven
Was bedeutet das Komma? – Phil
@Phil '[Zeile, Spalte]'. das Komma trennt. – AsheKetchum
Wenn Sie ein Array wie
habena = [[1, 2], [2, 3], [3, 4]]
Th en Sie die erste Spalte wie das extrahieren:
[row[0] for row in a]
So sieht das Ergebnis wie folgt aus:
[1, 2, 3]
, check it out!
a = [[1, 2], [2, 3], [3, 4]]
a2 = zip(*a)
a2[0]
es ist das gleiche wie oben, außer irgendwie ist es sauberere die zip machen die Arbeit aber einzelnen Arrays als Argument erfordern, die * eine Syntax entpackt das mehrdimensionales Array in einzelne Array-Argumente
Was ist oben? Denken Sie daran, dass die Antworten nicht immer gleich sortiert sind. – Muhd
Dies ist sauber, aber möglicherweise nicht die effizienteste, wenn die Leistung ein Problem ist, da es die gesamte Matrix transponiert. – IceArdor
FYI, das funktioniert in Python 2, aber in Python 3 erhalten Sie Generator-Objekt, das natürlich nicht einklagbar ist. –
Trotz des Einsatzes zip(*iterable)
eine verschachtelte Liste zu transponieren, können Sie auch die folgenden Befehle verwenden, wenn die verschachtelten Listen in der Länge variieren:
map(None, *[(1,2,3,), (4,5,), (6,)])
Ergebnisse in:
so[(1, 4, 6), (2, 5, None), (3, None, None)]
Die erste Spalte ist:
map(None, *[(1,2,3,), (4,5,), (6,)])[0]
#>(1, 4, 6)
Nun ein 'bisschen' spät ...
Wenn die Leistung wichtig ist und Ihre Daten rechteckig sind, können Sie sie auch in einer Dimension speichern und auf die Spalten zugreifen, indem Sie z. ...
A = [[1,2,3,4],[5,6,7,8]] #< assume this 4x2-matrix
B = reduce(operator.add, A) #< get it one-dimensional
def column1d(matrix, dimX, colIdx):
return matrix[colIdx::dimX]
def row1d(matrix, dimX, rowIdx):
return matrix[rowIdx:rowIdx+dimX]
>>> column1d(B, 4, 1)
[2, 6]
>>> row1d(B, 4, 1)
[2, 3, 4, 5]
Die ordentliche Sache ist wirklich schnell. Allerdings, negative Indizes funktionieren hier nicht! Sie können also nicht auf die letzte Spalte oder Zeile nach Index -1 zugreifen.
Wenn Sie eine negative Indizierung benötigen, können Sie die Accessor-Funktionen ein wenig anpassen, z.
def column1d(matrix, dimX, colIdx):
return matrix[colIdx % dimX::dimX]
def row1d(matrix, dimX, dimY, rowIdx):
rowIdx = (rowIdx % dimY) * dimX
return matrix[rowIdx:rowIdx+dimX]
Ich habe diese Methode überprüft und die Kosten für das Abrufen der Spalte sind viel billiger als verschachtelte für Schleifen. Das Reduzieren einer 2d-Matrix auf 1d ist jedoch teuer, wenn die Matrix groß ist, sagen wir 1000 * 1000. –
Eine weitere Möglichkeit, mit Matrizen
>>> from numpy import matrix
>>> a = [ [1,2,3],[4,5,6],[7,8,9] ]
>>> matrix(a).transpose()[1].getA()[0]
array([2, 5, 8])
>>> matrix(a).transpose()[0].getA()[0]
array([1, 4, 7])
[matrix[i][column] for i in range(len(matrix))]
Alle Spalten aus einer Matrix in eine neue Liste:
N = len(matrix)
column_list = [ [matrix[row][column] for row in range(N)] for column in range(N) ]
Sie diese auch verwenden können:
values = np.array([[1,2,3],[4,5,6]])
values[...,0] # first column
#[1,4]
Hinweis: Dies funktioniert nicht für ein eingebautes Array und ist nicht ausgerichtet (z. np.array ([[1,2,3], [4,5,6,7]]))
Ich denke, Sie eine Spalte aus einem Array extrahiert werden sollen, wie ein Array unter
import numpy as np
A = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
nun, wenn Sie die dritte Spalte im Format
D=array[[3],
[7],
[11]]
Dann müssen Sie zuerst das Array mit einer Matrix
B=np.asmatrix(A)
C=B[:,2]
D=asarray(C)
bekommen Und jetzt können Sie Element tun weise Berechnungen ähnlich wie in Excel.
Während dies mir sehr geholfen hat, denke ich, dass die Antwort viel kürzer sein kann: 1. A = np.array ([[1,2,3,4], [5,6,7,8], [9, 10,11,12]]) 2. Ein Array [:, 1] >> ([2, 6, 10]) – Ufos
lassen Sie uns sagen, dass wir n X m
Matrix (n
Zeilen und m
Spalten) haben beispielsweise 5 Zeilen und 4 Spalten
matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19,20]]
die Spalten in Python zu extrahieren, können wir Liste Verständnis, wie diese
[ [row[i] for row in matrix] for in range(4) ]
verwenden
Sie können 4 durch die Anzahl der Spalten Ihrer Matrix ersetzen. Das Ergebnis ist
[ [1,5,9,13,17],[2,10,14,18],[3,7,11,15,19],[4,8,12,16,20] ]
def get_col(arr, col):
return map(lambda x : x[col], arr)
a = [[1,2,3,4], [5,6,7,8], [9,10,11,12],[13,14,15,16]]
print get_col(a, 3)
Map-Funktion in Python einen anderen Weg zu gehen.
Wenn Sie mehr greifen wollen als eine gerade Spalte verwendet nur slice:
a = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
print(a[:, [1, 2]])
[[2 3]
[5 6]
[8 9]]
- 1. eine Matrix aus einem mehrdimensionalen Array Extrahierung
- 2. Echo aus einem mehrdimensionalen Array
- 3. Implode Daten aus einem mehrdimensionalen Array
- 4. Wählen Sie eine "Spalte" aus einem Firebase-Array
- 5. Wie entfernen Sie eine Spalte aus einem strukturierten numpy Array?
- 6. Eindimensionales Array aus einem Multidimension-Array extrahieren
- 7. Wie kann ich nur bestimmte Ebenen aus einem mehrdimensionalen Array extrahieren?
- 8. Extrahieren eines Array aus einem Array numpy
- 9. Wie erhält man Werte aus einem mehrdimensionalen Array in Twig?
- 10. Verwenden von LINQ zum Extrahieren bestimmter Werte aus einem mehrdimensionalen Array
- 11. hinzufügen JavaScript-Array zu einem mehrdimensionalen Array
- 12. Schleifen eines php mehrdimensionalen Array und Extrahieren spezifischer Daten
- 13. Extrahieren bestimmte Informationen aus einem Array
- 14. Eine Teilmenge von Werten aus einem assoziativen Array (PHP) extrahieren
- 15. Extrahieren Sie einen einzelnen String aus einem Array von Elementen
- 16. Rekursiv entfernen leere Elemente und Subarrays aus einem mehrdimensionalen Array
- 17. PHP entfernen doppelte Werte aus mehrdimensionalen Array
- 18. Get Array von einem mehrdimensionalen Objekt
- 19. zu einem mehrdimensionalen Array in PHP Hinzufügen
- 20. Wert von einem mehrdimensionalen Array ändern
- 21. Mit D3 mit einem mehrdimensionalen Array/Objekt
- 22. Speichern mehrdimensionalen dynamischen Array
- 23. So extrahieren Sie eine "Registrierung" URL aus einem Mail-Inhalt
- 24. PHP Konvertieren Sie mehrere Texteingabe zu einem mehrdimensionalen Array
- 25. Wie erhalten Sie Werte und Schlüssel aus einem multidimensionalen Array?
- 26. Umgestalten Numpy Arrays zu einem mehrdimensionalen Array
- 27. Text aus Array extrahieren - perl
- 28. So suchen Sie nach einem Wert im mehrdimensionalen Array
- 29. Konvertieren eines mehrdimensionalen Array von Strings in einem mehrdimensionalen Array von Zahlen
- 30. Extrahieren Sie eine Lösungsdatei aus WSS
Verwendung itertools.imap für große Daten –
Der itemgetter Ansatz 50x lief schneller als die Liste Verständnis Ansatz für meinen Anwendungsfall. Python 2.7.2, Anwendungsfall war viele Wiederholungen auf einer Matrix mit ein paar hundert Zeilen und Spalten. – joelpt