Numpy:使用一个数组作为另一个数组中元素的迭代测试

时间:2018-02-21 00:33:28

标签: python arrays numpy functional-programming

我有两个阵列,A描述了'块的起始位置'数据B描述了非阻塞原始数据中感兴趣事物的绝对位置。

我希望能够生成与块A中标识的元素的位置匹配的块数组B的索引。

e.g。

import numpy as np
A = np.array([0,10,13,25,27,33,100])
B = np.array([3, 3, 5, 21, 27, 32, 74])

我想返回一个看起来像这样的数组:

array([0, 0, 0, 2, 4, 4, 5])

即,用A中的元素描述B的索引位置的数组。

我可以写一个循环,比如:

list_holder = []
for e in B:
    list_holder.append(np.where(A>e)[0][0]-1)
np.array(list_holder)

但事实证明,对于大型阵列来说,这变得相当慢 - 是否有任何功能性或笨拙技巧可以作为单线程执行这种相对简单的操作?

2 个答案:

答案 0 :(得分:2)

您的解决方案是O(N ^ 2)。但是你可以在O(N)中完成这个,只需在1遍中迭代列表就这样。我不是蟒蛇人,所以如果这段代码不是" pythonic"这就是原因。

def digitize_sorted(a, b):
  j=0
  c = np.zeros(len(b))      
  for i in range(len(b)):
    while j < len(a) and a[j] <= b[i]:
       j += 1
    c[i] = j-1
  return c

答案 1 :(得分:1)

尝试searchsorted()

A = np.array([0,10,13,25,27,33,100])
B = np.array([3, 3, 5, 21, 27, 32, 74])

np.searchsorted(A, B, side="right") - 1