2013-06-18 12 views
8

Ich habe eine Matrix zu manipulieren xs genannt:Gibt es eine elegante Art und Weise meines ndarray

array([[1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 1], 
     [2, 1, 0, 0, 0, 1, 2, 1, 1, 2, 2]]) 

Jetzt habe ich die Nullen von dem nächstgelegenen vorherigen Elemente in der gleichen Zeile ersetzt werden soll (Unter der Annahme, dass die erste Säule sein muss nicht Null.). Die grobe Lösung, wie folgend:

In [55]: row, col = xs.shape 

In [56]: for r in xrange(row): 
    ....:  for c in xrange(col): 
    ....:   if xs[r, c] == 0: 
    ....:    xs[r, c] = xs[r, c-1] 
    ....: 

In [57]: xs 
Out[57]: 
array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1], 
     [2, 1, 1, 1, 1, 1, 2, 1, 1, 2, 2]]) 

Jede Hilfe sehr geschätzt wird.

+1

Warum denken Sie, dass Ihre Lösung nicht elegant ist? Die einzige Verbesserung, die ich mir vorstellen kann, ist Schleife vom zweiten Col zu starten, weil Sie die Annahme haben, dass es Ihnen ein paar Operationen ersparen wird;) –

+0

@jaux Ich würde gerne einige ndarray's Indizierungszauber verwenden, um dies zu tun. Die Leistung von Loop in Python ist nicht so gut. – Eastsun

Antwort

2

Wenn Sie pandas verwenden können, replace den Ersatz explizit zeigen in eine Anweisung:

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) 
1

Meine Version, basierend auf Schritt-für-Schritt-Roll- und Maskierung der ursprünglichen Anordnung, keine zusätzlichen Bibliotheken erforderlich (außer 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

Ohne komplizierte Indizierung Tricks verrückt, die aufeinander folgende Nullen herauszufinden, könnten Sie eine while Schleife haben, die es für so viele Wiederholungen wie aufeinander folgende Nullen geht in Ihrem Array:

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) 
Verwandte Themen