numpy:排除数组中的单saltuse和双saltuse

2024-09-30 14:36:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我将Python与numpy一起使用。你知道吗

我有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中数组的单saltuse和双saltuse)

对于此示例:

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

有人能建议我怎样得到out

p.S:如果我需要分别替换数组[False][False,False][False,False,False][False,False,False,False]上的[True][True,True][True,True,True][True,True,True,True]?你知道吗


Tags: numpyfalsetrue示例np数组outarray
3条回答

这可能不是解决这个问题的最佳方法,但请看以下内容。。。你知道吗

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)

如何使用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)

我还没有安装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]

相关问题 更多 >