it-swarm.com.de

Wie extrahiere ich alle Spalten außer einer aus einem Array (oder einer Matrix) in Python?

Mit einem numpy 2d-Array (oder einer Matrix) möchte ich alle Spalten außer der i-ten extrahieren.

Z.B. von

1 2 3 4
2 4 6 8
3 6 9 12

Ich hätte gerne z.

1 2 3
2 4 6
3 6 9

oder

1 2 4
2 4 8
3 6 12

Ich kann keinen pythonischen Weg finden, dies zu tun. Ich kann jetzt die angegebenen Spalten einfach extrahieren

a[:,n]

oder 

a[:,[n,n+1,n+5]]

Aber was ist mit dem Extrahieren von allen außer einem?

13

Da Sie im Normalfall trotzdem eine Kopie zurücksenden möchten, stellen Sie möglicherweise mit Hilfe von np.delete besser lesbaren Code her.

>>> a = np.arange(12).reshape(3, 4)
>>> np.delete(a, 2, axis=1)
array([[ 0,  1,  3],
       [ 4,  5,  7],
       [ 8,  9, 11]])
18
Jaime

Verwenden Sie ein Slice, das das letzte Element ausschließt. 

In [19]: a[:,:-1]
Out[19]: 
array([[1, 2, 3],
       [2, 4, 6],
       [3, 6, 9]])

Wenn Sie etwas anderes als das letzte Element möchten, würde ich einfach eine Liste erstellen, mit der Sie auswählen können.

In [20]: selector = [x for x in range(a.shape[1]) if x != 2]
In [21]: a[:, selector]
Out[21]: 
array([[ 1,  2,  4],
       [ 2,  4,  8],
       [ 3,  6, 12]])

http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html

20
chrisb

Werfen Sie einen Blick auf numpy's Erweitertes Schneiden

>>> import numpy as np
>>> a = np.array([[1,2,3,4], [2,4,6,8], [3,6,9,12]])
>>> a[:,np.array([True, True, False, True])]
array([[ 1,  2,  4],
       [ 2,  4,  8],
       [ 3,  6, 12]])
6
Peter Gibson

Die bereits gegebenen Antworten können leicht angepasst werden, um alle außer einer Liste von Spalten auszuwählen. Hier einige explizite Beispiele:

In [1]: import numpy as np
In [2]: a = np.arange(12).reshape(3, 4)
In [3]: a
Out[3]:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
In [4]: drop_cols = [0, 3]

# option 1: delete the columns you don't want (like @Jaime)
# (this is really the most straightforward)

In [5]: np.delete(a, drop_cols, axis=1)
Out[5]:
array([[ 1,  2],
       [ 5,  6],
       [ 9, 10]])

# option 2: pass the indices of columns to keep (like @chrisb)

In [6]: a[:, [i for i in range(a.shape[1]) if i not in drop_cols]]
Out[6]:
array([[ 1,  2],
       [ 5,  6],
       [ 9, 10]])

# option 3: use an array of T/F for each col (like @Peter Gibson)

In [7]: a[:, [i not in drop_cols for i in range(a.shape[1])]]
Out[7]:
array([[ 1,  2],
       [ 5,  6],
       [ 9, 10]])
0
Nathan