2009-05-24 11 views

Antwort

112

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:

8

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) 
+1

Verwendung itertools.imap für große Daten –

+0

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

130
>>> 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) 
+1

hat mich 2 Stunden gebraucht, um zu entdecken [:, 2] rate dieses Feature nicht in der offiziellen Slicing-Literatur? – sloven

+0

Was bedeutet das Komma? – Phil

+0

@Phil '[Zeile, Spalte]'. das Komma trennt. – AsheKetchum

49

Wenn Sie ein Array wie

haben
a = [[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] 
23

, 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

+5

Was ist oben? Denken Sie daran, dass die Antworten nicht immer gleich sortiert sind. – Muhd

+2

Dies ist sauber, aber möglicherweise nicht die effizienteste, wenn die Leistung ein Problem ist, da es die gesamte Matrix transponiert. – IceArdor

+2

FYI, das funktioniert in Python 2, aber in Python 3 erhalten Sie Generator-Objekt, das natürlich nicht einklagbar ist. –

1

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) 
2

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] 
+0

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. –

3

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]) 
6
[matrix[i][column] for i in range(len(matrix))] 
0

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) ] 
5

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]]))

6

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.

+1

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

3

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] ]

3
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.

0

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]] 
Verwandte Themen