2013-03-01 26 views
0

我使用Python和numpynumpy:排除數組中的單個和雙重saltuses

我有numpy的陣列b

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

我需要分別更換上陣列[True][True,True]陣列[False][False,False]。 (我需要排除False數組的單,雙saltuses)

對於這個exsample:

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

可有人請建議,我怎麼out

P.S:如果我需要更換陣列[False][False,False],在陣列[True][True,True],分別[True,True,True][True,True,True,True][False,False,False][False,False,False,False]

回答

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) 
+0

非常感謝你! – Olga 2013-03-01 09:59:20

+0

HYRY,如果我需要在數組[True],[True,True],[True]上替換[False],[False,False],[False,False,False]和[False,False,False,False] ,True,True]和[True,True,True,True]? – Olga 2013-03-13 11:19:38

+1

爲binary_dilation和binary_erosion設置迭代次數= 2。 – HYRY 2013-03-13 11:43:52

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