3

パッケージscipyには、バイナリ構造(タクシー(2,1)やチェス盤(2,2)など)を定義する関数があります。

import numpy
from scipy import ndimage
a = numpy.zeros((6,6), dtype=numpy.int) 
a[1:5, 1:5] = 1;a[3,3] = 0 ; a[2,2] = 2
s = ndimage.generate_binary_structure(2,2) # Binary structure
#.... Calculate Sum of 
result_array = numpy.zeros_like(a)

私が欲しいのは、与えられた構造でこの配列のすべてのセルを反復することです。次に、空の配列でインデックス付けされた現在のセル値に関数を追加します(関数の合計の例)。これは、バイナリ構造内のすべてのセルの値を使用します。

例えば:

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

#配列a。セル1、2の値は現在1です。構造体sと、結果の配列(result_array)の値を合計するなどの関数の例を指定すると、7(または現在のセル値が除外されている場合は6)になります。

誰かがアイデアを思いついた?

4

2 に答える 2

6

合計の特定のケースでは、ndimage.convolveを使用できます。

In [42]: import numpy as np

In [43]: a = np.zeros((6,6), dtype=np.int) 
a[1:5, 1:5] = 1;
a[3,3] = 0;
a[2,2] = 2

In [48]: s = ndimage.generate_binary_structure(2,2) # Binary structure

In [49]: ndimage.convolve(a,s)
Out[49]: 
array([[1, 2, 3, 3, 2, 1],
       [2, 5, 7, 7, 4, 2],
       [3, 7, 9, 9, 5, 3],
       [3, 7, 9, 9, 5, 3],
       [2, 4, 5, 5, 3, 2],
       [1, 2, 3, 3, 2, 1]])

積の特定のケースでは、 という事実を利用してlog(a*b) = log(a)+log(b)、問題を合計を含む問題に戻すことができます。たとえば、「product-convolve」したい場合b:

b = a[1:-1, 1:-1]
print(b)
# [[1 1 1 1]
#  [1 2 1 1]
#  [1 1 0 1]
#  [1 1 1 1]]

計算できます:

print(np.exp(ndimage.convolve(np.log(b), s, mode = 'constant')))
# [[ 2.  2.  2.  1.]
#  [ 2.  0.  0.  0.]
#  [ 2.  0.  0.  0.]
#  [ 1.  0.  0.  0.]]

b負の値が含まれている場合、状況はより複雑になります。

b[0,1] = -1
print(b)
# [[ 1 -1  1  1]
#  [ 1  2  1  1]
#  [ 1  1  0  1]
#  [ 1  1  1  1]]

しかし、不可能ではありません:

logb = np.log(b.astype('complex'))
real, imag = logb.real, logb.imag
print(np.real_if_close(
    np.exp(
        sum(j * ndimage.convolve(x, s, mode = 'constant')
            for x,j in zip((real, imag),(1,1j))))))
# [[-2. -2. -2.  1.]
#  [-2. -0. -0.  0.]
#  [ 2.  0.  0.  0.]
#  [ 1.  0.  0.  0.]]
于 2012-11-20T01:27:36.263 に答える
2

深さ 2 のゼロの壁を使用すると、より簡単になります。

In [11]: a0
Out[11]: 
array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  1.,  1.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  2.,  1.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  1.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  1.,  1.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])

In [12]: b0 = zeros_like(a0)

In [13]: for i in range(1,len(a0)-1):
   ....:     for j in range(1,len(a0)-1):
   ....:         b0[i,j] = sum(a0[i-1:i+2, j-1:j+2] * s)

これにより、必要に応じて、2 つの部分行列を乗算して合計することができます。(ここでもっと複雑なことをすることもできます...)

In [14]: b0
Out[14]: 
array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  2.,  3.,  3.,  2.,  1.,  0.],
       [ 0.,  2.,  5.,  7.,  7.,  4.,  2.,  0.],
       [ 0.,  3.,  7.,  9.,  9.,  5.,  3.,  0.],
       [ 0.,  3.,  7.,  9.,  9.,  5.,  3.,  0.],
       [ 0.,  2.,  4.,  5.,  5.,  3.,  2.,  0.],
       [ 0.,  1.,  2.,  3.,  3.,  2.,  1.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])

In [15]: b0[1:len(b0)-1, 1:len(b0)-1]
Out[15]: 
array([[ 1.,  2.,  3.,  3.,  2.,  1.],
       [ 2.,  5.,  7.,  7.,  4.,  2.],
       [ 3.,  7.,  9.,  9.,  5.,  3.],
       [ 3.,  7.,  9.,  9.,  5.,  3.],
       [ 2.,  4.,  5.,  5.,  3.,  2.],
       [ 1.,  2.,  3.,  3.,  2.,  1.]])
于 2012-11-19T23:50:46.317 に答える