Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算间隔之间的值数_Python_Arrays_Count - Fatal编程技术网

Python 计算间隔之间的值数

Python 计算间隔之间的值数,python,arrays,count,Python,Arrays,Count,python中有没有有效的方法来计算一个数字数组在特定间隔之间的时间?我将使用的间隔数可能会非常大 比如: 您必须至少迭代列表一次 下面的解决方案适用于实现比较的任何序列/间隔(等),并使用算法在间隔中找到正确的点,因此速度非常快 它将与浮动、文本或任何内容一起使用。只需传递一个序列和一个间隔列表 from collections import defaultdict from bisect import bisect_left def count_intervals(sequence, in

python中有没有有效的方法来计算一个数字数组在特定间隔之间的时间?我将使用的间隔数可能会非常大

比如:


您必须至少迭代列表一次

下面的解决方案适用于实现比较的任何序列/间隔(
等),并使用算法在间隔中找到正确的点,因此速度非常快

它将与浮动、文本或任何内容一起使用。只需传递一个序列和一个间隔列表

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)