我有一个特定的数据集,如
array([ 2.1, 3. , 179.1, 1.9, 2.6, 425.8, 1.7, 3.1,
4. , 144. , 2.2, 2.3, 5.3, 135.5, 2. , 2.7,
.....])]
这里我想计算连续出现的数字低于6并将它们保存在特定的计数器中。例如,在前三个数字中,有两个数字在出现较大数字之前连续低于6。因此,counter2会增加1.如果三个数字连续出现,那么counter3将增加1(如第二行),依此类推。是否有任何功能在python中执行,如果不是我如何继续?提前致谢。
答案 0 :(得分:3)
根据我对您的问题的理解,这是我的解决方案:
from collections import defaultdict
def countSuccessive(data):
counters = defaultdict(int)
count = 0
for i in data:
if i < 6:
count += 1
elif count != 0:
counters[count] += 1
count = 0
if count != 0:
counters[count] += 1
return counters
result = countSuccessive([
2.1, 3. , 179.1, 1.9, 2.6, 425.8, 1.7, 3.1,
4. , 144. , 2.2, 2.3, 5.3, 135.5, 2. , 2.7])
print repr(result)
输出:
defaultdict(<type 'int'>, {2: 3, 3: 2})
在这种情况下,计数器为result[2]
和result[3]
。您可以检查字典以查看存在哪些密钥。
答案 1 :(得分:2)
import numpy as np
import itertools as it
a = np.array([ 2.1, 3. , 179.1, 1.9,
2.6, 425.8, 1.7, 3.1,
4. , 144. , 2.2, 2.3,
5.3, 135.5, 2. , 2.7])
counters = {}
for grp in (len(list(n)) for t,n in it.groupby(a>6) if not t):
counters[grp] = counters.get(grp, 0) + 1
# counters: {2: 3, 3: 2}, i.e. counter2 = 3, counter3 = 2
或者,如果您只想要counter2
变量:
counter2 = sum(1 for t,n in it.groupby(a>6) if not t and len(list(n)) == 2)
答案 2 :(得分:1)
这可能有用。
def f(data):
counters = {}
succ = 0
for item in data:
if item < 6:
succ += 1
elif succ > 0:
try:
counters[succ] += 1
except KeyError:
counters[succ] = 1
succ = 0
if succ > 0:
try:
counters[succ] += 1
except KeyError:
counters[succ] = 1
return counters
它返回一个字典,其中键是连续数字小于6的数字,值是这样的出现次数。我可能不太了解它。如果是这样,请纠正我。
编辑:同时cdhowie发布了类似的答案,摆脱了try / except。
答案 3 :(得分:1)
我的解决方案
from collections import Counter
from itertools import groupby
l = [2.1, 3., 179.1, 1.9, 2.6, 425.8, 1.7, 3.1,
4., 144., 2.2, 2.3, 5.3, 135.5, 2., 2.7]
lengths = [len(list(g)) for (k, g) in groupby(l, key = lambda x: x < 6) if k]
print Counter(lengths)
如果您没有具有Counter类的Python 2.7,则可以使用defaultdict:
d = defaultdict(int)
for el in lengths:
d[el] += 1
print d