首页 > 解决方案 > Python:计算不间断间隔的数量

问题描述

考虑一个由 0 和 1 组成的数组 Y。例如:Y = (0,1,1,0)。我想计算0和1的不间断间隔的数量。在我们的示例中,n0 = 2 和 n1 = 1。我有一个脚本可以满足需要。虽然它不是很优雅。有人知道更流畅或更pythonic的版本吗?

import pandas as pd
import numpy as np

# storage
counter = {}

# number of random draws
n = 10

# dataframe of random draw between 0 and 1
Y = pd.DataFrame(np.random.choice(2, n))

# where are the 0s and 1s
idx_0 = Y[Y[0] == 0].index
idx_1 = Y[Y[0] == 1].index

# count intervals of uninterrupted 0s
j = 0
for i in idx_0:
    if i+1 < n:
        if Y.loc[i+1, 0] == 1:
            j += 1
        else:
            continue

if Y.loc[n-1, 0] == 0:
    j += 1


counter['n_0'] = j

# count intervals of uninterrupted 1s
j = 0
for i in idx_1:
    if i+1 < n:
        if Y.loc[i+1, 0] == 0:
            j += 1
        else:
            continue

if Y.loc[n-1, 0] == 1:
    j += 1

counter['n_1'] = j

标签: pythoncountintervals

解决方案


numbers = [0, 1, 1, 0]
def runs(x, numbers):
  number_string = ''.join([str(n) for n in numbers])
  return len([r for r in number_string.split('1' if x == 0 else '0') if r])

print(runs(0, numbers))
print(runs(1, numbers))

使用数据框更新:

import pandas as pd
import numpy as np

# storage
counter = {}

# number of random draws
n = 10

# dataframe of random draw between 0 and 1
Y = pd.DataFrame(np.random.choice(2, n))
print([v[0] for v in Y.values.tolist()])

def runs(x, numbers):
  number_string = ''.join([str(n) for n in numbers])
  return len([len(r) for r in number_string.split('1' if x == 0 else '0') if r])

values = [v[0] for v in Y.values.tolist()]
print(values)
print('Runs of 0: {}'.format(runs(0, values)))
print('Runs of 1: {}'.format(runs(1, values))

推荐阅读