Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.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_Numpy_Pandas - Fatal编程技术网

Python 从间隔数组创建类别

Python 从间隔数组创建类别,python,numpy,pandas,Python,Numpy,Pandas,给定一组范围,如下所示 dates = [[1200, 1300], [1100, 1300], [1200, 1300], [1200, 1400], [1100, 1400]] 我想以一种有效的方式提取所有可能的间隔,然后计算每个间隔中可用的范围数 对于该示例,可能间隔的结果矩阵为: [1100, 1200] [1200, 1300] [1300, 1400] 0 0 1 0 1 1

给定一组范围,如下所示

dates = [[1200, 1300], [1100, 1300], [1200, 1300], [1200, 1400], [1100, 1400]]
我想以一种有效的方式提取所有可能的间隔,然后计算每个间隔中可用的范围数

对于该示例,可能间隔的结果矩阵为:

     [1100, 1200]  [1200, 1300]  [1300, 1400]
0           0          1           0
1           1          1           0
2           0          1           0
3           0          1           1
4           1          1           1
然后,sum by列给出每个间隔中的范围数

[1100, 1200]    2
[1200, 1300]    5
[1300, 1400]    2

我在这里遵循了这个方法。可以比这更紧凑。那就改天吧

c=[[1200, 1300], [1100, 1300], [1200, 1300], [1200, 1400], [1100, 1400]]
print "string values", c
uniquea={}
new=[]
for i in c:
    j=str(i)
    if j in new:
        uniquea[j]+=1
    else:
        uniquea[j]=1
        new.append(j)

打印uniquea,新的

以下是一种方法,可为您提供所需的
numpy
矩阵
m
,带有布尔值:

def getOverlap(a, b):
    return max(0, min(a[1], b[1]) - max(a[0], b[0]))

nodes     = sorted(np.unique(np.array(dates).flatten()))
intervals = zip(nodes[:-1], nodes[1:])
# [(1100, 1200), (1200, 1300), (1300, 1400)]

m = np.array([[bool(getOverlap(i, d)) for d in dates] for i in intervals])

m.sum(axis=1)
# array([2, 5, 2])
请注意,如果希望“矩阵”是一个
pandas
DataFrame
,只需执行以下操作:

pd.DataFrame(m.transpose().astype(int), columns=intervals)

   (1100, 1200)  (1200, 1300)  (1300, 1400)
0             0             1             0
1             1             1             0
2             0             1             0
3             0             1             1
4             1             1             1

如果有一个区间,比如说
[1100,1150]
,我们是创建一个新的区间,还是您的问题需要使用固定的区间长度?在您的示例中,您有
interval_length=100
@johntitutusjungao不需要固定的间隔长度。如果有一个区间,比如[1100,1150],我们应该有区间[1100,1150]和[1150,1200]