找到数组中分离对的数量

时间:2016-12-04 14:08:39

标签: python numpy

早上好, 我有一个像numpy数组:     [0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0]

我希望找到分开的1对的数量。

三个(或更多)连续1也计为对,即:在此示例中,返回的数字应为3.

实现这一目标的最佳技术是什么?

非常感谢!

4 个答案:

答案 0 :(得分:1)

使用itertools.groupby

k保存下面的基于唯一键0/1的列表,g保存唯一键k的对应组迭代器

import itertools
target = 1
lst = [0,1,1,0,1,1,1,0,0,1,0,1,1,0]
pair_count = 0

for k,g in itertools.groupby(lst):
    if k==target and len(list(g))>1: # match target and more than 1 count as pair
        pair_count += 1
# pair_count = 3

答案 1 :(得分:0)

您可以自己轻松实现,请参阅下面的代码:

l = [0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0]
# Create flag to skip all elements that have >2 1 in sequence
added = False
pairs_counter = 0 
for i in range(1, len(l)):
    rem = l[i - 1]
    if l[i] == 1 and rem == 1 and not added:
        added = True
        pairs_counter +=1
    if l[i] == 0:
        added = False
print (pairs_counter)

此方法的复杂性为O(n)

答案 2 :(得分:0)

我会选择这样的事情:

a = [0 1 1 0 1 1 1 0 0 1 0 1 1 0]
sum([
   a[i-2] == a[i-1] == 1 and a[i] == 0
   for i in xrange(2,len(a))
]) + (len(a) > 2 and a[-1] == a[-2] == 1)

它只是将TrueFalse加在一起。我想有些人会发现它很难看,我觉得还可以。

应该注意的是,如果列表非常大,这不是一个好的选择,因为它会在内存中创建bool列表。很容易避免这种情况。

答案 3 :(得分:0)

使用itertools.groupby和sum

sum(1 for target, group_count in itertools.groupby(lst) 
    if target == 1 and len(list(group_count)) >= 2)