2012-11-19 58 views
6

Làm thế nào để tôi "khắc" hoặc che dấu một mảng có khối lượng 2D theo công thức chỉ mục? Tôi không quan tâm giá trị của phần tử là gì, chỉ có vị trí của nó trong mảng.khắc mảng 2D numpy theo chỉ mục

Ví dụ, đưa ra một mảng mxm, làm thế nào để trích xuất tất cả các yếu tố có địa chỉ phù hợp với

for i in range(0,m): 
    for j in range(0,m): 
     if j-i-k>=0: 
      A[i,j] = 1 
     elif j-p-k>=0: 
      A[i,j] = 1 
     elif i-k>=0: 
      A[i,j] = 1 
     else: 
      A[i,j] = 0 
     j=j+1 
    i=i+1 

nơi

k và p là một hàng rào tùy ý

Giả

k<m 
p<m 

Điều này kết thúc trông giống như một lát chéo + một lát ngang + a lát dọc. Nó có thể được thực hiện mà không có các vòng trên không?

+0

Tiếp tục câu hỏi về new_data = dữ liệu [mask] @tcaswell, sử dụng "cho" mặt nạ tạo của tôi "loại bỏ" một số hàng và cột và bằng cách nào đó để lại tôi với một vector , không phải là mảng dữ liệu gốc.shape. Tại sao? Làm thế nào tôi có thể ngăn chặn điều này? – Hokiexterra

Trả lời

1
xdim,ydim = data.shape 
k = 2 
a, b = np.meshgrid(range(ydim),range(xdim)) 
mask = (b - a -k) < 0 

new_data = data[mask] 

new_data2 = np.array(data) # to force a copy 
new_data2[~mask] = 0 

new_data là một vector vì các quá trình mặt nạ (thực hiện theo cách này) flattens mảng. Bạn đang chọn một hình dạng với một rách rưới không thể được biểu diễn như một mảng. Nếu bạn chỉ muốn đặt giá trị không được chọn thành 0, hãy sử dụng new_data2.

+0

Câu hỏi khác về – Hokiexterra

+0

@ user1836722 xem chỉnh sửa. – tacaswell

+0

Cảm ơn, tôi sẽ cố gắng! – Hokiexterra

3
In [1]: import numpy as np 

In [2]: k = 2 

In [3]: i, j = np.ogrid[0:5,0:5] 

In [4]: mask = (j-i-k < 0) 

In [5]: mask 
Out[5]: 
array([[ True, True, False, False, False], 
     [ True, True, True, False, False], 
     [ True, True, True, True, False], 
     [ True, True, True, True, True], 
     [ True, True, True, True, True]], dtype=bool) 

In [6]: mask.shape 
Out[6]: (5, 5) 

In [7]: mask.dtype 
Out[7]: dtype('bool') 
1

Dưới đây là một cách khác sử dụng np.indices:

>>> import numpy as np 
>>> a = np.arange(90).reshape(10,9) 
>>> b = np.indices(a.shape) 
>>> k = 2 
>>> i = b[1] - b[0] - k 
>>> a[i < 0] 
array([ 0, 1, 9, 10, 11, 18, 19, 20, 21, 27, 28, 29, 30, 31, 36, 37, 38, 
    39, 40, 41, 45, 46, 47, 48, 49, 50, 51, 54, 55, 56, 57, 58, 59, 60, 
    61, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 
    79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89]) 
+0

+1 vì tôi đã học được điều gì đó – tacaswell

Các vấn đề liên quan