【问题标题】:Find if a sorted array of floats contains numbers in a certain range efficiently查找已排序的浮点数组是否有效地包含一定范围内的数字
【发布时间】:2016-10-26 11:29:21
【问题描述】:

我有一个排序的 numpy 浮点数组,我想知道这个数组是否包含给定范围内的数字。请注意,我对数组中数字的位置不感兴趣。我只想知道是否至少有一个数字在该范围内。

由于我必须在大量间隔上执行相同的操作(数组在整个操作期间保持不变),因此我担心效率。

谁能帮帮我?

【问题讨论】:

  • 我想你忘了添加你尝试过的代码......
  • 您自己尝试过什么吗? numpy.searchsorted 可能是一个不错的起点
  • 我认为 numpy histogram 是这个任务的不错选择。它甚至不需要排序数组

标签: python arrays numpy


【解决方案1】:

正如 cmets 中所述,np.searchsorted 可能很有用,而且确实如此。如问题中所述,数组保持不变,而我们在迭代中具有不同的范围。因此,假设范围存储在一个(n,2) 形状的数组中,第一列代表开始,而第二列是这些范围的结束值。

我们会用np.searchsorted 来解决,就像这样 -

np.searchsorted(a,ranges[:,0]) != np.searchsorted(a,ranges[:,1])

这个想法是,如果某个范围内有任何数字,那么使用第一列(起始值)找到的排序索引将小于并且因此不等于第二列中的索引(停止值)。

示例运行 -

In [75]: a   # Input data array
Out[75]: 
array([ 13.,  20.,  22.,  24.,  36.,  50.,  52.,  60.,  64.,  65.,  65.,
        66.,  72.,  76.,  81.,  84.,  88.,  88.,  90.,  97.])

In [76]: ranges # Array of ranges
Out[76]: 
array([[ 19.,  26.],
       [ 22.,  33.],
       [ 25.,  35.],
       [ 38.,  62.]])

In [77]: np.searchsorted(a,ranges[:,0]) != np.searchsorted(a,ranges[:,1])
Out[77]: array([ True,  True, False,  True], dtype=bool)

【讨论】:

  • 谢谢,这就是我要找的!
  • @andrea 很高兴能帮上忙!
猜你喜欢
  • 1970-01-01
  • 2017-11-01
  • 2010-12-09
  • 2011-09-21
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-27
相关资源
最近更新 更多