J'ai une matrice nommée 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: p> toute aide sera grandement appréciée. P> p> xs code>:
3 Réponses :
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]]
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)
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)
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.