3 votes

Transformer un nombre en zéro dans une matrice

J'ai la matrice suivante :

a = array([
   [100. , 100., 100.],
   [175.2, 198.,  32.],
   [ 38. , 82. ,  38.],
   [155. , 32. ,  23.],
   [ 38. , 67. ,  30.]])

Comment changer les nombres de toutes les lignes, sauf la dernière, en zéro si un nombre d'une ligne n'est pas égal à 38 et 32 ? Ce que je veux obtenir est le suivant :

a = array([
   [ 0 ,  0 ,  0 ],
   [ 0 ,  0 , 32.],
   [38.,  0 , 38.],
   [ 0 , 32.,  0 ],
   [38., 67., 30.]])

Ensuite, je veux laisser le premier numéro qui apparaît dans chaque colonne. Quelque chose comme ceci :

a = array([
   [ 0 ,  0 ,  0 ],
   [ 0 ,  0 , 32.],
   [38.,  0 ,  0 ],
   [ 0 , 32.,  0 ],
   [ 0 ,  0 ,  0 ]])

2voto

zipa Points 16012

Ceci devrait suffire :

positions = [(y, x) for x, y in enumerate(np.argmax(np.isin(a, [32,38]), axis=0))]

result = np.zeros(a.shape)

for p in positions:
    result[p] = a[p]

#[[ 0 ,  0 ,  0 ],
# [ 0 ,  0 , 32.],
# [38.,  0 ,  0 ],
# [ 0 , 32.,  0 ],
# [ 0 ,  0 ,  0 ]]

1voto

jpp Points 83462

Voici une solution vectorisée et en place.

import numpy as np

a = np.array([[100. , 100., 100.],
              [175.2, 198.,  32.],
              [ 38. , 82. ,  38.],
              [155. , 32. ,  23.],
              [ 38. , 67. ,  30.]])

a[:-1][(a[:-1]!=38) & (a[:-1]!=32)] = 0

# array([[  0.,   0.,   0.],
#        [  0.,   0.,  32.],
#        [ 38.,   0.,  38.],
#        [  0.,  32.,   0.],
#        [ 38.,  67.,  30.]])

Vous pouvez également utiliser numpy pour votre résultat final :

idx = ((a!=0).argmax(axis=0), np.array(range(a.shape[1])))
result = np.empty(a.shape)
result[idx] = a[idx]

# array([[  0.,   0.,   0.],
#        [  0.,   0.,  32.],
#        [ 38.,   0.,   0.],
#        [  0.,  32.,   0.],
#        [  0.,   0.,   0.]])

0voto

Patrick Artner Points 29630

Et une autre solution (bien qu'inefficace) :

import numpy as np

a = np.array([
   [100. , 100., 100.],
   [175.2, 198.,  32.],
   [ 38. , 82. ,  38.],
   [155. , 32. ,  23.],
   [ 38. , 67. ,  30.]])

def what(y,lastRow):
    found = False
    for o in y:
        if o in [32,38] and not found and not lastRow:
            found = True
            yield o
        else:
            yield 0

# probably inefficient due to list comp instead of np-own ops
b = np.array([list(what(y,idy==len(a)-1)) for idy,y in enumerate(a)]) 

print(b)

Salida:

[[  0.   0.   0.]
 [  0.   0.  32.]
 [ 38.   0.   0.]
 [  0.  32.   0.]
 [  0.   0.   0.]]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X