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