python - 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
解决方案
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))
推荐阅读
- docusignapi - OAuth 调用的 Docusign 速率限制是多少?
- html - HTML5 音频 -- DOMException: 该元素没有支持的来源
- javascript - 在反应或javascript中以模态显示味精
- r - 使用 dplyr 有一种方法可以保留行但将空白添加到选定的重复值
- javascript - 拆分字符串,复制每个字符并重新加入以形成新字符串 Abcd 将变为 AAbbccdd
- python - 如何在整个 DataFrame 中首次出现“NaN”后删除或删除所有行
- python - 如何在 sqlite3 中使用 Python 输入中的变量?
- pandas - 优化涉及 Pandas 系列的计算
- raster - Gdal减去1位光栅让我很难过
- python - 无法从同级目录导入