Python 计算间隔之间的值数
python中有没有有效的方法来计算一个数字数组在特定间隔之间的时间?我将使用的间隔数可能会非常大 比如:Python 计算间隔之间的值数,python,arrays,count,Python,Arrays,Count,python中有没有有效的方法来计算一个数字数组在特定间隔之间的时间?我将使用的间隔数可能会非常大 比如: 您必须至少迭代列表一次 下面的解决方案适用于实现比较的任何序列/间隔(等),并使用算法在间隔中找到正确的点,因此速度非常快 它将与浮动、文本或任何内容一起使用。只需传递一个序列和一个间隔列表 from collections import defaultdict from bisect import bisect_left def count_intervals(sequence, in
您必须至少迭代列表一次 下面的解决方案适用于实现比较的任何序列/间隔(
等),并使用算法在间隔中找到正确的点,因此速度非常快
它将与浮动、文本或任何内容一起使用。只需传递一个序列和一个间隔列表
from collections import defaultdict
from bisect import bisect_left
def count_intervals(sequence, intervals):
count = defaultdict(int)
intervals.sort()
for item in sequence:
pos = bisect_left(intervals, item)
if pos == len(intervals):
count[None] += 1
else:
count[intervals[pos]] += 1
return count
data = [4,4,1,18,2,15,6,14,2,16,2,17,12,3,12,4,15,5,17]
print count_intervals(data, [10, 20])
将打印
defaultdict(<type 'int'>, {10: 10, 20: 9})
defaultdict(,{10:10,20:9})
这意味着,如果数字是整数,则有10个值,如示例中所示,将间隔表示为冻结集可能是最快的(值得尝试)。不确定这些间隔是否保证相互排斥——如果不是,则
intervals = [frozenzet(range(10)), frozenset(range(10, 20))]
counts = [0] * len(intervals)
for n in mylist:
for i, inter in enumerate(intervals):
if n in inter:
counts[i] += 1
如果间隔是互斥的,则可以通过在增量后立即从内部循环中退出来稍微加快此代码。然而,对于互斥的整数间隔>=0,有一个更吸引人的选择:首先,准备一个辅助索引,例如,给定您的起始点
数据结构,该数据结构可能是
indices = [sum(i > x for x in startpoints) - 1 for i in range(max(startpoints))]
然后
counts = [0] * len(intervals)
for n in mylist:
if 0 <= n < len(indices):
counts[indices[n]] += 1
计数=[0]*len(间隔)
对于mylist中的n:
如果0我不知道你的列表会有多大,但这里有另一种方法
import numpy as np
mylist = [4,4,1,18,2,15,6,14,2,16,2,17,12,3,12,4,15,5,17]
np.histogram(mylist, bins=[0,9,19])
您还可以使用value_counts()和pd.cut()的组合来帮助您完成工作
import pandas as pd
mylist = [4,4,1,18,2,15,6,14,2,16,2,17,12,3,12,4,15,5,17]
split_mylist = pd.cut(mylist, [0, 9, 19]).value_counts(sort = False)
print(split_mylist)
这段代码将返回以下内容:
(0,10]10
(10, 20] 9
数据类型:int64
然后,您可以使用to_list()函数获取所需内容
split_mylist = split_mylist.tolist()
print(split_mylist)
输出:[10,9]cool!现在我如何对值进行排序(并保持区间端点的顺序)?我在mylist中添加了一些值,结果显示为defaultdict(,{40:1,10:6,30:6})。Dict没有顺序。您可以使用类似于:的东西来对k进行排序(mydict):打印k,mydict[k]
或:对于间隔中的值:打印值,结果[值]
感谢您的回答!我只是想知道如何修改它,以便在间隔中没有值时,列表将包含间隔:0。也就是说,如果我们键入count_interval(数据,[10,20,30]),我们将得到结果defaultdict(,{10:10,20:9,30:0})@JamesElder用于间隔值:result.setdefault(值,0)
split_mylist = split_mylist.tolist()
print(split_mylist)