2017-04-18 10 views
6

मैं एक बहुआयामी numpy सरणी जहां तत्वों या तो सही है या गलत मान रहे हैं:जांच करें कि सभी तत्वों को एक 2D सरणी पार फिसलने खिड़कियों में सच हैं अजगर

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 

अब मैं एक और सरणी एम उत्पन्न करने के लिए की जरूरत है, जहां प्रत्येक साइट एम [i, j] पर मूल्य ग्रिड पर निर्भर करता है [मैं: मैं + 2, जम्मू: j + 2]

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 

में वहाँ के रूप में किसी तरह सरणी एम ग्रिड से तत्वों का उपयोग कर भरने के लिए है डबल लूप के बिना?

उत्तर

3

कार्य # 1

यहाँ 2D convolution के साथ एक दृष्टिकोण है -

from scipy.signal import convolve2d as conv2 

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

नमूना रन -

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

कृपया ध्यान दें कि अंतिम पंक्ति और उम्मीद उत्पादन से अंतिम स्तंभ होगा प्रारंभिक आउटपुट सरणी के साथ सभी शून्य हो। यह कोड की स्लाइडिंग प्रकृति की वजह से है, क्योंकि इसमें पंक्तियों और स्तंभों के साथ इतना हद तक नहीं होगा।

कार्य # 2

यहाँ 2D वर्दी फिल्टर के साथ एक और है -

from scipy.ndimage.filters import uniform_filter as unif2d 

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

कार्य # 3

यहाँ 4D slided windowed view के साथ एक और -

from skimage.util import view_as_windows as viewW 

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

उस all(axis=(2,3)) के साथ, हम सभी तत्वों के लिए सभी विंडो के आयामों को सभी True तत्वों के साथ जांच रहे हैं।


रनटाइम परीक्षण

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

धन्यवाद दिवाकर! मुझे लगता है कि फिसल गया दृश्य दृश्य मुझे सबसे ज्यादा समझ में आता है - यह दृष्टिकोण बाद में इस परियोजना में अन्य कार्यों के लिए भी उपयोगी होना चाहिए। मुझे यह समझने के लिए थोड़ा और जांच करनी है कि वे – kevinkayaks

+0

कैसे काम करते हैं मैं समझता हूं कि व्यूडब्ल्यू (ग्रिड, (2,2)) ग्रिड से 2x2 ब्लॉक खींचता है। सरल प्रश्न आने वाले प्रश्न: .all ((2,3)) क्या करता है? क्यों (2,3)? – kevinkayaks

+0

@kevinkayaks इस पर कुछ टिप्पणी जोड़ा गया। – Divakar

संबंधित मुद्दे