web-dev-qa-db-fra.com

Comment extraire toutes les colonnes sauf une d'un tableau (ou matrice) en python?

Étant donné un tableau numpy 2d (ou une matrice), je voudrais extraire toutes les colonnes sauf la i-ème.

Par exemple. de

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

Je voudrais avoir, par exemple.

1 2 3
2 4 6
3 6 9

ou

1 2 4
2 4 8
3 6 12

Je n'arrive pas à trouver un moyen pythonique de le faire. Je maintenant que vous pouvez extraire des colonnes données simplement

a[:,n]

ou 

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

Mais qu'en est-il de les extraire tous sauf un?

13

Puisque dans le cas général vous retournerez quand même une copie, vous pourriez vous retrouver à produire un code plus lisible en utilisant np.delete :

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

Utilisez une tranche qui exclut le dernier élément. 

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

Si vous voulez autre chose que le dernier élément, je construirais simplement une liste avec laquelle sélectionner.

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

Jetez un coup d'œil à numpy's advanced slicing

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

Les réponses déjà données peuvent facilement être adaptées pour sélectionner toutes les colonnes sauf une liste, mais voici quelques exemples explicites:

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