8
votes

Y a-t-il un moyen élégant de manipuler mon ndarray

J'ai une matrice nommée xs : xxx

maintenant je veux remplacer les zéros par l'élément précédent le plus proche de la même ligne (en supposant que la première colonne doit être non nulle.). La solution brute comme suit: xxx

toute aide sera grandement appréciée.


2 commentaires

Pourquoi pensez-vous que votre solution n'est pas élégante? Seule amélioration que je puisse penser est de commencer la boucle du deuxième col, car vous avez l'hypothèse, cela vous fera économiser quelques opérations;)


@Jaux je voudrais utiliser la magie d'indexation de Ndarray pour le faire. La performance de la boucle dans Python n'est pas si bonne.


3 Réponses :


1
votes

Ma version, basée sur le rouleau et le masquage à pas étape par étape de la matrice initiale, aucune bibliothèque supplémentaire requise (à l'exception de NUMPY):

import numpy as np

a = np.array([[1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 1],
              [2, 1, 0, 0, 0, 1, 2, 1, 1, 2, 2]])

for i in xrange(a.shape[1]):
    a[a == 0] = np.roll(a,i)[a == 0]
    if not (a == 0).any():             # when all of zeros
        break                          #        are filled

print a
## [[1 1 1 1 1 1 1 1 1 2 1]
##  [2 1 1 1 1 1 2 1 1 2 2]]


0 commentaires

2
votes

Si vous pouvez utiliser pandas , remplacer code> montrer explicitement le remplacement dans une instruction:

import pandas as pd

import numpy as np

a = np.array([[1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 1],
              [2, 1, 0, 0, 0, 1, 2, 1, 1, 2, 2]])


df = pd.DataFrame(a, dtype=np.float64)

df.replace(0, method='pad', axis=1)


0 commentaires

0
votes

sans devenir folle avec des astuces d'indexation compliquées qui découvrent des zéros consécutifs, vous pouvez avoir un pendant que code> la boucle allant pour autant d'itérations que les zéros consécutifs sont dans votre tableau:

zero_rows, zero_cols = np.where(xs == 0)
while zero_cols :
    xs[zero_rows, zero_cols] = xs[zero_rows, zero_cols-1]
    zero_rows, zero_cols = np.where(xs == 0)


0 commentaires