【问题标题】:Counting number of elements in non-overlapping sub-intervals of array计算数组的非重叠子间隔中的元素数
【发布时间】:2018-06-26 12:16:51
【问题描述】:

我想统计列表的不重叠子序列中的元素个数。例如,如下图所示:

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.6 包含在第一个 [0.2,0.7] 区间中,因此存在我们不希望的重叠。所需的输出是

  0.2 0.7   count = 2
  2.2 2.7   count = 1
  3.8 4.3   count = 1

如果将原始数组分解为子数组,则可以轻松解决此问题,但是在包含数千个数字的数组中,此类方法的计算量很大。 在上面的示例中,我将间隔显示为输出,这只是为了解释我的问题。我只想要每个间隔的计数。 我能得到帮助吗?

提前致谢。

【问题讨论】:

  • nlst 总是排序吗?
  • 是的。它总是排序的。

标签: python arrays python-3.x counting


【解决方案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)

或者,您可以以类似的方式创建一个包含三元组(下限、上限、计数)的列表。

【讨论】:

  • 嗨@Cito,非常感谢。只有一个后续问题。如何将 lst 划分为这些间隔的子列表?再次感谢。
【解决方案2】:

这会起作用

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

【讨论】:

  • 嗨Shyam,你能解释一下'if(len(list)):calculate(list)'的含义吗?非常感谢。
  • 我们只是逐个元素地缩短数组元素并调用递归函数来迭代数组并检查总和,所以这里检查长度意味着新的较短数组是否为空白,如果为空白则移出否则进一步减少。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-19
  • 2019-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
相关资源
最近更新 更多