【问题标题】:Numpy: Use one array as an iterative test for elements in another arrayNumpy:使用一个数组作为另一个数组中元素的迭代测试
【发布时间】:2018-07-31 11:24:17
【问题描述】:

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

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

例如

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)

但事实证明,对于大型数组,这变得相当慢 - 是否有任何功能或 numpy-tricks 可以将这个相对简单的操作作为单线执行?

【问题讨论】:

  • 你可以在 O(N) 中做到这一点。只需编写一个在 1 遍中迭代数组的函数。不需要 O(N^2) 解决方案。
  • 好点。 digitize 对假设更为笼统(您的数组已经排序)。

标签: python arrays numpy functional-programming


【解决方案1】:

您的解决方案是 O(N^2)。但是你可以在 O(N) 中做到这一点,只需像这样迭代 1 遍中的列表。我不是 python 人,所以如果这段代码不是“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

【讨论】:

  • 对我来说看起来不错,尽管对于一些不是很大的 N 来说,它会被 digitize 打败,更多的是基于 searchsorted 的答案(C-core vs .python-loops;尽管算法复杂性不同)。也许您也应该陈述您的假设以使答案更完整。
【解决方案2】:

试试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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多