2017-09-26 49 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