0

で Python を使用しnumpyます。

私はnumpy配列を持っていますb:

 b = np.array([True,True,True,False,False,True,True,False,False,False,True,False,True])

[False]配列と[False,False]配列[True]をそれぞれ置き換える必要があり[True,True]ます。(私は、配列のシングルおよびダブル ソルタスを除外する必要がありますFalse)

この例では:

out= np.array([True,True,True,True, True, True,True,False,False,False,True,True,True])

誰かが提案してもらえますか、どうすれば入手できoutますか?

PS:[False]配列、[False,False][False,False,False]および[False,False,False,False]の配列[True][True,True][True,True,True]および をそれぞれ置き換える必要がある場合は[True,True,True,True]?

4

3 に答える 3

3

使い方scipy.ndimage.binary_dilation&使い方scipy.ndimage.binary_erosion

import numpy as np
from scipy import ndimage
b = np.array([True,True,True,False,False,True,True,False,False,False,True,False,True])
ndimage.binary_erosion(ndimage.binary_dilation(b), border_value=1)
于 2013-03-01T08:31:46.240 に答える
1

私はnumpyをインストールしていませんが、次のコードは、あなたが望むものを正しく理解していれば、numpyで同様のことを行うためのアイデアを与えると思います。

b = [True,True,True,False,False,True,True,False,False,False,True,False,True,
     False,False,False,False,True,False,False,True]
print b,'\n'

def grignote(X):
    it = iter(xrange(len(X)))
    for i in it:
        print 'i == %d     %s' % (i,X[i])
        if X[i]==False:
            j = (k for k in it if X[k]==True).next()
            print '  j == %d   %s   X[%d:%d]==%r' % (j,X[j],i,j,X[i:j])
            if j-i<3:
                print '  executing X[%d:%d]==%r' % (i,j,[True for m in xrange(j-i)])
                X[i:j] = [True for m in xrange(j-i)]
            else:
                print '  --- no execution ---   too long'

grignote(b)
print '\n',b

結果

[True, True, True, False, False, True, True, False, False, False, True, False, True, False, False, False, False, True, False, False, True] 

i == 0     True
i == 1     True
i == 2     True
i == 3     False
  j == 5   True   X[3:5]==[False, False]
  executing X[3:5]==[True, True]
i == 6     True
i == 7     False
  j == 10   True   X[7:10]==[False, False, False]
  --- no execution ---   too long
i == 11     False
  j == 12   True   X[11:12]==[False]
  executing X[11:12]==[True]
i == 13     False
  j == 17   True   X[13:17]==[False, False, False, False]
  --- no execution ---   too long
i == 18     False
  j == 20   True   X[18:20]==[False, False]
  executing X[18:20]==[True, True]

[True, True, True, True, True, True, True, False, False, False, True, True, True, False, False, False, False, True, True, True, True]
于 2013-03-01T08:46:45.127 に答える
1

これはこれを解決する最良の方法ではないかもしれませんが、以下を見てください...

In [115]: b
Out[115]:
array([ True,  True,  True, False, False,  True,  True, False, False,
       False,  True, False,  True], dtype=bool)

In [116]: l = [(k,len(list(g))) for k, g in itertools.groupby(b)]

In [117]: l
Out[117]:
[(True, 3),
 (False, 2),
 (True, 2),
 (False, 3),
 (True, 1),
 (False, 1),
 (True, 1)]

In [118]: l2 = [(True, x[1]) if x[1] in [1,2] else x for x in l]

In [119]: l2
Out[119]: [(True, 3), (True, 2), (True, 2), (False, 3), (True, 1), (True, 1), (True, 1)]

In [120]: l3 = [[x[0]] * x[1] for x in l2]

In [121]: l3
Out[121]:
[[True, True, True],
 [True, True],
 [True, True],
 [False, False, False],
 [True],
 [True],
 [True]]

In [122]: l4 = [x for x in itertools.chain(*l3)]

In [123]: l4
Out[123]:
[True,
 True,
 True,
 True,
 True,
 True,
 True,
 False,
 False,
 False,
 True,
 True,
 True]

In [124]: out = np.array(l4)

In [125]: out
Out[125]:
array([ True,  True,  True,  True,  True,  True,  True, False, False,
       False,  True,  True,  True], dtype=bool)
于 2013-03-01T08:28:52.613 に答える