it-swarm.com.de

Wie extrahieren Sie eine Spalte aus einem mehrdimensionalen Array?

Weiß jemand, wie man eine Spalte aus einem mehrdimensionalen Array in Python extrahiert?

201
jaweria
>>> 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 "reshape", um Speicher zuzuweisen

Beispiel: (Zuweisung eines Arrays mit Formung der Matrix (3x4))

nrows = 3
ncols = 4
my_array = numpy.arange(nrows*ncols, dtype='double')
my_array = my_array.reshape(nrows, ncols)
184
Andre Luiz

Könnte es sein, dass Sie ein NumPy-Array verwenden? Python hat das array -Modul, aber das unterstützt keine mehrdimensionalen Arrays. Normal Python Listen sind auch eindimensional.

Wenn Sie jedoch eine einfache zweidimensionale Liste wie diese haben:

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]

Extrahieren der zweiten Spalte (Index 1):

>>> column(A, 1)
[2, 6]

Oder alternativ einfach:

>>> [row[1] for row in A]
[2, 6]
154
Martin Geisler

Wenn Sie ein Array wie haben

a = [[1, 2], [2, 3], [3, 4]]

Dann extrahieren Sie die erste Spalte wie folgt:

[row[0] for row in a]

Das Ergebnis sieht also so aus:

[1, 2, 3]
69
Andrei Arsenin

hör zu!

a = [[1, 2], [2, 3], [3, 4]]
a2 = Zip(*a)
a2[0]

es ist dasselbe wie oben, außer dass es irgendwie ordentlicher ist, wenn Zip die Arbeit erledigt, aber einzelne Arrays als Argumente benötigt. Die Syntax * a entpackt das mehrdimensionale Array in einzelne Array-Argumente

34
Mac D
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 ist ein weiterer Weg zu gehen.

13
Peter Paul
>>> x = arange(20).reshape(4,5)
>>> x array([[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14],
        [15, 16, 17, 18, 19]])

wenn Sie die zweite Spalte möchten, können Sie verwenden

>>> x[:, 1]
array([ 1,  6, 11, 16])
10
simomod
[matrix[i][column] for i in range(len(matrix))]
9
renatov

Der itemgetter-Operator kann ebenfalls hilfreich sein, wenn Sie Python im Map-Reduction-Stil für ein wenig Abwechslung bevorzugen, anstatt Listenverständnisse zu verwenden!

# 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)
8
Gregg Lind

Sie können dies auch verwenden:

values = np.array([[1,2,3],[4,5,6]])
values[...,0] # first column
#[1,4]

Hinweis: Dies funktioniert nicht bei eingebauten Arrays und ist nicht ausgerichtet (z. B. np.array ([[1,2,3], [4,5,6,7]]).

7
Sergey

nehmen wir an, wir haben n X m Matrix (n Zeilen und m Spalten) sagen 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]]

Um die Spalten in Python zu extrahieren, können wir ein solches Listenverständnis verwenden

[ [row[i] for row in matrix] for in range(4) ]

Sie können 4 durch die Anzahl der Spalten in 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] ]

6
Serge_k

Ich denke, Sie möchten eine Spalte aus einem Array wie einem Array unten extrahieren

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 erhalten möchten

D=array[[3],
[7],
[11]]

Dann müssen Sie zuerst das Array zu einer Matrix machen

B=np.asmatrix(A)
C=B[:,2]
D=asarray(C)

Und jetzt können Sie elementweise Berechnungen durchführen, ähnlich wie Sie es in Excel tun würden.

6

Ein weiterer Weg 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])
3
Shashwat

Na ja, ein bisschen zu spät ...

Wenn es auf die Leistung ankommt und Ihre Daten rechteckig sind, können Sie sie auch in einer Dimension speichern und auf die Spalten zugreifen, indem Sie regelmäßig 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]

Das Schöne ist, dass dies sehr schnell geht. Allerdings, negative Indizes funktionieren hier nicht! Sie können also nicht über den Index -1 auf die letzte Spalte oder Zeile zugreifen.

Wenn Sie eine negative Indizierung benötigen, können Sie die Accessor-Funktionen etwas 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]
2
Zappotek

Ich bevorzuge den nächsten Hinweis: Die Matrix heißt matrix_a und benutze column_number, beispielsweise:

import numpy as np
matrix_a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
column_number=2

# you can get the row from transposed matrix - it will be a column:
col=matrix_a.transpose()[column_number]
2
Vik Ermolenko

Obwohl Sie Zip(*iterable) verwenden, um eine verschachtelte Liste zu transponieren, können Sie auch Folgendes verwenden, wenn die Länge der verschachtelten Listen unterschiedlich ist:

map(None, *[(1,2,3,), (4,5,), (6,)])

ergebnisse in:

[(1, 4, 6), (2, 5, None), (3, None, None)]

Die erste Spalte lautet also:

map(None, *[(1,2,3,), (4,5,), (6,)])[0]
#>(1, 4, 6)
1
Lorenz Lo Sauer

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

Wenn Sie mehr als nur eine Spalte greifen möchten, verwenden Sie einfach slice:

 a = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
    print(a[:, [1, 2]])
[[2 3]
[5 6]
[8 9]]
0
Molina12