2013-06-18 36 views
8

Ben bir matris xs adında var:işlemek için bazı zarif bir yolu var mı benim ndarray

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

Şimdi aynı satırda en yakın önceki öğe tarafından sıfırları değiştirmek istiyor (ilk sütun olmalıdır varsayarsak sıfırdan farklı.). aşağıdaki gibi kaba çözelti:

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

bir Yardım büyük takdir edilecektir. adım-adım haddeleme ve ilk dizinin maskeleme dayalı

+1

Çözümünüzün neden zarif olmadığını düşünüyorsunuz? Düşünebildiğim tek gelişme, ikinci sütuntan döngü başlatılmasıdır, çünkü varsayımınız var, size birkaç işlem kazandırır;) –

+0

@jaux Bunu yapmak için bazı ndarray'ın indeksleme sihrini kullanmak istiyorum. Python'da döngü performansı çok iyi değil. – Eastsun

cevap

2

açıkça yer değiştirme gösterecektir pandas, replace kullanabiliyorsa bir talimat:

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

Benim versiyonu, hiçbir ek kütüphaneler (Numpy hariç) gerekli:

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

art arda sıfır anlamaya karmaşık indeksleme hileleriyle çıldırıyor olmadan, içinde vardır ardışık sıfır olduğu kadar çok tekrarlamalar için giden bir while döngü var olabilir senin dizi:

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) 
İlgili konular