【问题标题】:Faster way to find indexes that satisfy the condition更快地找到满足条件的索引的方法
【发布时间】:2023-02-25 03:54:00
【问题描述】:

我想在给定的索引中找到满足 2 个条件的所有索引。 像下面这样,

# the given indexes: id
id = np.array([4,6,2,3,1,9])
array1 = np.array([1,3,5,3,2,3,1,1,3,6,7,9])
array2 = np.array([1,3,1,1,3,3,6,7,9,5,3,2])
threshold1 = 1
threshold2 = 2

Result = id[(threshold1 < array1[id]) & (threshold2 < array2[id])]
print(Result)

-> [4 1 9]

由于我需要在 for 循环中计算结果,因此我想找到一种更快的方法来完成它。 有什么建议吗? 另外,在 for 循环中使用 np.array 或 np.where 似乎很慢,我应该在列表中这样做吗?

多谢。

【问题讨论】:

  • “在 for 循环中计算结果”——循环的是什么?显示那个循环
  • 通常使用 numpy 的操作非常快(可能比某些常规 python 函数更快)。您可能需要以某种方式降低搜索的复杂性。
  • 请阐明您的具体问题或提供更多详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: python numpy


【解决方案1】:

据我所知,或者正在寻找索引,在id中(顺便说一句,命名变量id是个坏主意。正如着色显示的那样,这是一个python预定义函数。你不应该覆盖它) ,条件为真。

所以相当于

ii = np.array([4,6,2,3,1,9])
array1 = np.array([1,3,5,3,2,3,1,1,3,6,7,9])
array2 = np.array([1,3,1,1,3,3,6,7,9,5,3,2])

def findIndex():
    l=[]
    for i in ii:
        if array1[i]>1 and array2[i]>2:
            l.append(i)
    return l

在我的 PC 上,这个功能比你的快 2.65 倍。但这可能只是因为您没有很多数据,因此使用 for 循环的成本(应该避免使用 numpy)小于避免索引的开销。使用大 3 或 4 倍的数组,您的代码可能会更快。 但更重要的是,这只是一个非常简单的数组循环。所以这种东西被 numba 非常有效地优化了。

from numba import jit
import numpy as np
ii = np.array([4,6,2,3,1,9])
array1 = np.array([1,3,5,3,2,3,1,1,3,6,7,9])
array2 = np.array([1,3,1,1,3,3,6,7,9,5,3,2])

@jit(nopython=True)
def findIndex():
    l=[]
    for i in ii:
        if array1[i]>1 and array2[i]>2:
            l.append(i)
    return l

这次,该函数比您的快 21 倍(至少在第二次调用之后。第一次调用仅快 2 倍,因为编译发生在第一次调用时)。

【讨论】:

    猜你喜欢
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多