计算数组非重叠子区间中的元素数
Counting number of elements in non-overlapping sub-intervals of array
我想计算一个 list.for 示例的 非重叠 子序列中的元素数量,如下所示:
lst = [0.2,1.3,2.2,3.5]
L = 0.5
for x in lst:
lb = x # lowebound
ub = x+L # upperbound
print(lb,ub)
输出为
0.2 0.7 count=1
1.3 1.8 count=1
2.2 2.7 count=1
3.5 4.0 count=1
正如我们所见,这些间隔不重叠。此外,在每个区间 [lb, ub] 中,我们只有一个属于 lst 的元素,因此每个区间 count = 1。
然而,下面给出了一个复杂的案例
nlst = [0.2,0.6,2.2,3.8]
使用上面的代码会产生我们不想要的重叠间隔。例如使用上面的代码,我们得到
0.2 0.7
0.6 1.1
2.2 2.7
3.8 4.3
现在,由于第一个 [0.2,0.7] 区间中包含 0.6,因此存在我们不希望出现的重叠。期望的输出是
0.2 0.7 count = 2
2.2 2.7 count = 1
3.8 4.3 count = 1
如果将原始数组分解为子数组,这个问题很容易解决,但是在包含数千个数字的数组中,这种方法的计算量很大。
在上面的示例中,我将间隔显示为输出,这只是为了解释我的问题。我只想要每个间隔的计数。
我能得到帮助吗?
提前致谢。
这个怎么样?
lst = [0.2, 0.6, 2.2, 3.8]
L = 0.5
count = None
counts = []
append = counts.append
ub = lst[0]
for x in lst:
if x < ub:
count += 1
else:
append(count)
count = 1
ub = x + L
counts = counts[1:] + [count]
print(counts)
更新:如果你也想收集间隔:
lst = [0.2, 0.6, 2.2, 3.8]
L = 0.5
ival = count = None
ivals, counts = [], []
ival = (None, lst[0])
for x in lst:
if x < ival[1]:
count += 1
else:
ivals.append(ival)
counts.append(count)
ival = x, x + L
count = 1
ivals = ivals[1:] + [ival]
counts = counts[1:] + [count]
print(ivals)
print(counts)
或者,您可以用类似的方式创建一个包含三元组(下限、上限、计数)的列表。
这会起作用
list = [0.2,0.3,0.4,2.2,2.3,3.5,3.8,3.9,7.1]
interval = 0.5
list.sort()
answer = []
def calculate (list):
count = 1
check = list[0]
del list[0]
list_copy = [i for i in list]
for index, item in enumerate(list_copy):
if check + interval > list_copy[index] :
count += 1
list.remove(item)
answer.append(count)
if (len(list)):
calculate(list)
else:
return
calculate(list);
print answer
我想计算一个 list.for 示例的 非重叠 子序列中的元素数量,如下所示:
lst = [0.2,1.3,2.2,3.5]
L = 0.5
for x in lst:
lb = x # lowebound
ub = x+L # upperbound
print(lb,ub)
输出为
0.2 0.7 count=1
1.3 1.8 count=1
2.2 2.7 count=1
3.5 4.0 count=1
正如我们所见,这些间隔不重叠。此外,在每个区间 [lb, ub] 中,我们只有一个属于 lst 的元素,因此每个区间 count = 1。 然而,下面给出了一个复杂的案例
nlst = [0.2,0.6,2.2,3.8]
使用上面的代码会产生我们不想要的重叠间隔。例如使用上面的代码,我们得到
0.2 0.7
0.6 1.1
2.2 2.7
3.8 4.3
现在,由于第一个 [0.2,0.7] 区间中包含 0.6,因此存在我们不希望出现的重叠。期望的输出是
0.2 0.7 count = 2
2.2 2.7 count = 1
3.8 4.3 count = 1
如果将原始数组分解为子数组,这个问题很容易解决,但是在包含数千个数字的数组中,这种方法的计算量很大。 在上面的示例中,我将间隔显示为输出,这只是为了解释我的问题。我只想要每个间隔的计数。 我能得到帮助吗?
提前致谢。
这个怎么样?
lst = [0.2, 0.6, 2.2, 3.8]
L = 0.5
count = None
counts = []
append = counts.append
ub = lst[0]
for x in lst:
if x < ub:
count += 1
else:
append(count)
count = 1
ub = x + L
counts = counts[1:] + [count]
print(counts)
更新:如果你也想收集间隔:
lst = [0.2, 0.6, 2.2, 3.8]
L = 0.5
ival = count = None
ivals, counts = [], []
ival = (None, lst[0])
for x in lst:
if x < ival[1]:
count += 1
else:
ivals.append(ival)
counts.append(count)
ival = x, x + L
count = 1
ivals = ivals[1:] + [ival]
counts = counts[1:] + [count]
print(ivals)
print(counts)
或者,您可以用类似的方式创建一个包含三元组(下限、上限、计数)的列表。
这会起作用
list = [0.2,0.3,0.4,2.2,2.3,3.5,3.8,3.9,7.1]
interval = 0.5
list.sort()
answer = []
def calculate (list):
count = 1
check = list[0]
del list[0]
list_copy = [i for i in list]
for index, item in enumerate(list_copy):
if check + interval > list_copy[index] :
count += 1
list.remove(item)
answer.append(count)
if (len(list)):
calculate(list)
else:
return
calculate(list);
print answer