重複 - python 配列 追加



2D配列のスライディングウィンドウですべての要素がTrueであるかどうかをチェックする-Python (1)

アプローチ1

2D畳み込みを使った1つのアプローチ -

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

期待される出力の最後の行と最後の列は、初期化された出力配列を持つすべて0であることに注意してください。 これは、行と列に沿った程度がそれほど大きくないため、コードの滑りやすい性質のためです。

アプローチ2

2D一様なフィルタを使用した別の方法 -

from scipy.ndimage.filters import uniform_filter as unif2d

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

アプローチ3

ここに4Dスライディングウィンドウビューの別のものがあります -

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

私は要素が真または偽の値である多次元配列を持っています:

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

今度は、別の配列Mを生成する必要があります。ここで、各サイトM [i、j]の値は、グリッド[i:2、j: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 

ダブルループのないグリッドの要素を使って配列Mを埋める方法はありますか?





vectorization