2013-06-18 24 views
8

Tôi đã một ma trận có tên xs:Có một số cách thanh lịch để thao tác của tôi ndarray

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

Bây giờ tôi muốn thay thế các số không bởi các yếu tố trước gần nhất trong cùng hàng (Giả sử rằng cột đầu tiên phải là nonzero.). Giải pháp thô như sau:

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

Mọi trợ giúp sẽ được đánh giá cao.

+1

Tại sao bạn nghĩ giải pháp của mình không thanh lịch? Chỉ cải tiến tôi có thể nghĩ là bắt đầu vòng lặp từ col thứ hai, bởi vì bạn có giả định, nó sẽ giúp bạn tiết kiệm một vài hoạt động;) –

+0

@jaux Tôi muốn sử dụng một số phép thuật lập chỉ mục của ndarray để làm điều này. Hiệu suất của vòng lặp trong python không phải là quá tốt. – Eastsun

Trả lời

2

Nếu bạn có thể sử dụng pandas, replace sẽ hiển thị một cách rõ ràng sự thay thế trong một hướng dẫn:

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

phiên bản của tôi, dựa trên từng bước lăn và mặt nạ của mảng ban đầu, không có thư viện bổ sung cần thiết (trừ 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

mà không đi điên với thủ đoạn lập chỉ mục phức tạp mà tìm ra số không liên tiếp, bạn có thể có một vòng lặp while mà đi cho bao nhiêu lần lặp như số không liên tiếp có trong bạn mảng:

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) 
Các vấn đề liên quan