2017-10-17 3 views
1

Comment est-il possible de supprimer toutes les colonnes qui ont les mêmes valeurs dans un tableau numpy? Par exemple, si je cette matrice:comment supprimer des colonnes avec les mêmes valeurs dans numpy

[0 1 2 3 1]

[0 2 2 1 0]

[0 4 2 3 4]

[0 1 2 3 4]

[0 1 2 4 5]

Je veux obtenir une nouvelle matrice qui ressemble à ceci:

[1 3 1]

[2 1 0]

[4 3 4]

[1 3 4]

[1 4 5]

Répondre

3

est possible de comparer la matrice avec le version décalée de lui-même, si toutes les paires sont égales pour une colonne, alors la colonne contient seulement une valeur unique, qui peut être enlevée avec l'indexation booléenne:

a[:, ~np.all(a[1:] == a[:-1], axis=0)] 

#array([[1, 3, 1], 
#  [2, 1, 0], 
#  [4, 3, 4], 
#  [1, 3, 4], 
#  [1, 4, 5]]) 
1

En supposant

import numpy 
a = numpy.array([[0, 1, 2, 3, 1], 
       [0, 2, 2, 1, 0], 
       [0, 4, 2, 3, 4], 
       [0, 1, 2, 3, 4], 
       [0, 1, 2, 4, 5]]) 

puis

b = a == a[0,:] # compares first row with all others using broadcasting 
# b: array([[ True, True, True, True, True], 
#   [ True, False, True, False, False], 
#   [ True, False, True, True, False], 
#   [ True, True, True, True, False], 
#   [ True, True, True, False, False]], dtype=bool) 

utilisant all le long des lignes agit comme une opération de rangée sage and (merci Divakar!):

c = b.all(axis=0) 
# c: array([ True, False, True, False, False], dtype=bool) 

que vous pouvez utiliser pour l'indexation booléenne

a[:, ~c] 
Out: 
array([[1, 3, 1], 
     [2, 1, 0], 
     [4, 3, 4], 
     [1, 3, 4], 
     [1, 4, 5]]) 

En tant oneliner laid:

a[:, ~(a == a[0,:]).all(0)] 
+0

Bonne idée de commencer. Mais, pourquoi ne pas faire simplement: '~ b.all (0)' et l'utiliser pour masquer les colonnes? Devrait être plus performant et aussi plus court que prod-réduire et la conversion de type. – Divakar

+0

@Divakar merci, c'est en fait la commande que je cherchais: D –