2017-04-18 18 views
6

Tôi có một mảng NumPy đa chiều mà các yếu tố hoặc là Đúng hay Sai giá trị:Kiểm tra xem tất cả các yếu tố này là True trong trượt cửa sổ qua một mảng 2D - Python

import numpy as np 
#just making a toy array grid to show what I want to do 
grid = np.ones((4,4),dtype = 'bool') 
grid[0,0]=False 
grid[-1,-1]=False 
#now grid has a few false values but is a 4x4 filled with mostly true values 

Bây giờ tôi cần phải tạo ra một mảng M, trong đó giá trị tại mỗi địa điểm M [i, j] phụ thuộc vào lưới [i: i + 2, j: j + 2] như trong

M = np.empty((4x4)) #elements to be filled 

#here is the part I want to clean up 
for ii in range(4): 
    for jj in range(4): 

     #details here are unimportant. It's just that M[ii,jj] depends on 
     #multiple elements of grid in some way 
     if ii+2<=4 and jj+2<=4:  
      M[ii,jj] = np.all(grid[ii:ii+2,jj:jj+2]==True) 
     else: 
      M[ii,jj] = False 

có một số cách để lấp đầy mảng M sử dụng các yếu tố từ lưới mà không có vòng lặp đôi?

Trả lời

3

Approach # 1

Dưới đây là một cách tiếp cận với 2D convolution -

from scipy.signal import convolve2d as conv2 

out = (conv2(grid,np.ones((2,2),dtype=int),'valid')==4).astype(int) 

mẫu chạy -

In [118]: grid 
Out[118]: 
array([[False, True, True, True], 
     [ True, True, True, True], 
     [ True, True, True, True], 
     [ True, True, True, False]], dtype=bool) 

In [119]: (conv2(grid,np.ones((2,2),dtype=int),'valid')==4).astype(int) 
Out[119]: 
array([[0, 1, 1], 
     [1, 1, 1], 
     [1, 1, 0]]) 

Xin lưu ý rằng hàng cuối cùng và cột cuối cùng từ sản lượng dự kiến ​​sẽ là tất cả các số không với mảng đầu ra được khởi tạo. Điều này là do tính chất trượt của mã, vì nó sẽ không có nhiều mức độ dọc theo các hàng và cột.

Cách tiếp cận # 2

Đây là một với 2D thống nhất bộ lọc -

from scipy.ndimage.filters import uniform_filter as unif2d 

out = unif2d(grid,size=2).astype(int)[1:,1:] 

Approach # 3

Đây là một với 4D slided windowed view -

from skimage.util import view_as_windows as viewW 

out = viewW(grid,(2,2)).all(axis=(2,3)).astype(int) 

Với điều đó all(axis=(2,3)), chúng tôi chỉ kiểm tra dọc theo cả kích thước của mỗi cửa sổ cho tất cả các phần tử là tất cả các phần tử True.


Runtime kiểm tra

In [122]: grid = np.random.rand(5000,5000)>0.1 

In [123]: %timeit (conv2(grid,np.ones((2,2),dtype=int),'valid')==4).astype(int) 
1 loops, best of 3: 520 ms per loop 

In [124]: %timeit unif2d(grid,size=2).astype(int)[1:,1:] 
1 loops, best of 3: 210 ms per loop 

In [125]: %timeit viewW(grid,(2,2)).all(axis=(2,3)).astype(int) 
1 loops, best of 3: 614 ms per loop 
+0

Cảm ơn Divakar! Tôi nghĩ rằng chế độ xem cửa sổ trượt có ý nghĩa nhất đối với tôi-- cách tiếp cận đó sẽ hữu ích cho các tác vụ khác sau này trong dự án này. Tôi phải nghiên cứu thêm một chút để hiểu cách thức hoạt động của chúng – kevinkayaks

+0

Tôi hiểu viewW (lưới, (2,2)) kéo ra khối 2x2 từ lưới. Câu hỏi đơn giản đến: Cái gì .all ((2,3)) làm gì? Tại sao (2,3)? – kevinkayaks

+0

@kevinkayaks Đã thêm vài nhận xét về nó. – Divakar

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