2017-09-26 60 views
1

我有以下数据文件。连续发生的物品数量

1 3 
2 6 
3 7 
4 6 
5 8 
6 4 
7 5 
8 9 
9 7 
10 2 
11 3 
12 5 
13 3 

我的目标是具有等于或大于5 2栏其中相继出现至少3次项的计数。我已经能够弄清楚计数部分,但不能确定继承部分。

所以,我想这个数据文件的输出为2,如第2列有2个字符串(6,7,6,8)和(5,9,7),其中我有数字等于并且大于5次连续出现至少3次。

import numpy as np 
data=np.loadtxt('/Users/Hrihaan/Desktop/DataF.txt') 
z=data[:,1] 
count = len([i for i in z if i >= 5]) 
print(count) 

任何帮助将不胜感激。

+0

你的意思可能是团体数量?为什么不添加预期的输出?另外,发布的代码是否能让您获得正确的结果?另外,将第二列作为示例输入数组发布会更好。 – Divakar

+0

是Divakar,组数。发布的代码给我计数等于或大于5的数字,但我被连续3次卡住了。 – Hrihaan

回答

2

下面是使用csvitertools.groupby一个纯Python的方法:

首先,让我假文件:

>>> s = """1 3 
... 2 6 
... 3 7 
... 4 6 
... 5 8 
... 6 4 
... 7 5 
... 8 9 
... 9 7 
... 10 2 
... 11 3 
... 12 5 
... 13 3""" 
>>> import io 

现在,它的肉:

>>> import itertools 
>>> import csv 
>>> with io.StringIO(s) as f: 
...  reader = csv.reader(f, delimiter=' ') 
...  second_col = (int(c) for _, c in reader) 
...  gb = itertools.groupby(second_col, (5).__le__) 
...  x = sum(k for k, g in gb if k and len(list(g)) >= 3) 
... 
>>> x 
2 
4

方法1:获取的启动,停止索引每个有效的组,让他们的罪名 -

mask = np.concatenate(([False], ar>=5, [False])) 
idx = np.flatnonzero(np.concatenate(([False], mask[1:] != mask[:-1], [False]))) 
count = ((idx[1::2]-idx[::2])>=3).sum() 

方法2:使用1D卷积 -

mask = np.convolve(ar>=5,[1]*3)>=3 
out = (mask[1:] > mask[:-1]).sum() 
-1

您可以遍历列,检查并保持运行计数。

start = 0 # Keeps track of first number >= 5 
count = 0 

for i in z: 
    if i >= 5: 
     start += 1 
    elif i < 5 and start > 2: # Checks if there were at least 3 in succession, and if the series has ended 
     count += 1 
     start = 0 # Reset start 

print count