Python:计算不间断间隔的数量

Python:计算不间断间隔的数量,python,count,intervals,Python,Count,Intervals,考虑由0和1组成的数组Y。例如:Y=(0,1,1,0)。我想计算0和1的不间断间隔数。在我们的示例中,n0=2,n1=1。我有一个脚本,可以完成需要的任务。但它不是很优雅。有人知道更流畅或更通俗的版本吗 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.D

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

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
将熊猫作为pd导入
将numpy作为np导入
#储藏
计数器={}
#随机抽取次数
n=10
#0和1之间随机抽取的数据帧
Y=pd.数据帧(np.随机选择(2,n))
#0和1在哪里
idx_0=Y[Y[0]==0]。索引
idx_1=Y[Y[0]==1]。索引
#计算不间断0的间隔
j=0
对于idx_0中的i:
如果i+1
使用dataframe更新:

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))
使用dataframe更新:

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

一个更简洁的解决方案,利用了pandas方法:

counter = Y[0][Y[0].diff() != 0].value_counts()
  • Y[0].diff()
    计算连续元素之间的差异
  • diff!=0
    标记值更改的索引
  • Y[idx].value\u counts()
    统计每个值的频率
10个随机元素[0,1,1,0,1,1,1,1,1,1,1]的示例结果:

1    2
0    2
Name: 0, dtype: int64
如果您坚持将密钥改为“n_0”和“n_1”,则可以使用

counter = counter.rename(index={i: f'n_{i}' for i in range(2)})

您还可以使用
dict(counter)
将其转换为dict,即使pandas对象具有与
counter[key]
相同的功能,为您提供相应的值。

利用pandas方法的更简洁的解决方案:

counter = Y[0][Y[0].diff() != 0].value_counts()
  • Y[0].diff()
    计算连续元素之间的差异
  • diff!=0
    标记值更改的索引
  • Y[idx].value\u counts()
    统计每个值的频率
10个随机元素[0,1,1,0,1,1,1,1,1,1,1]的示例结果:

1    2
0    2
Name: 0, dtype: int64
如果您坚持将密钥改为“n_0”和“n_1”,则可以使用

counter = counter.rename(index={i: f'n_{i}' for i in range(2)})

您还可以使用
dict(counter)
将其转换为dict,即使pandas对象具有与
counter[key]
相同的功能,可以为您提供相应的值。

我相信原始海报是在寻找间隔数,请将
max()
更改为
len()不要考虑零,你说得对。我误解了。非常感谢。我已经更新了答案。我相信原始的海报正在寻找间隔的数量,将<代码>最大()/代码>改为<代码> Le()/<代码>,不要考虑零。你说得对。我误解了。非常感谢。我已经更新了答案。如果Y=(0,1,1,0)的结果是n0=2和n1=2,那么这是错误的,因为有两个0(n0=2)的不间断间隔和一个1(n0=1)的不间断间隔。好的,对不起。我以为你指的是我原来帖子中的例子。可能会发布示例输入Y以进行验证。您还知道numpy数组的一行程序吗?@cluness对于numpy 1D数组,语法非常相似<代码>计数器(一个[np.hstack([True,np.diff(a)!=0]))
。其中,
计数器
来自
集合
标准库,
a
是数组。您只需要在开始时添加另一个True来考虑第一个值,因为
np.diff
将为x元素提供x-1值。如果Y=(0,1,1,0)的结果是n0=2和n1=2,那么这是错误的,因为有两个0的不间断间隔(n0=2)和一个1的不间断间隔(n0=1)。好的,抱歉。我以为你指的是我原来帖子中的例子。可能会发布示例输入Y以进行验证。您还知道numpy数组的一行程序吗?@cluness对于numpy 1D数组,语法非常相似<代码>计数器(一个[np.hstack([True,np.diff(a)!=0]))
。其中,
计数器
来自
集合
标准库,
a
是数组。您只需要在开始时添加另一个True来考虑第一个值,因为
np.diff
将为您提供x元素的x-1值。