gpt4 book ai didi

python - 找到所有接近目标的值,如 numpy.searchsorted() 但返回所有相同的值?

转载 作者:太空宇宙 更新时间:2023-11-04 06:01:45 24 4
gpt4 key购买 nike

有没有什么好的方法可以找到接近多个目标的排序数组A中的所有值索引?使用 numpy.searchsorted() 可以让我们高效地找到接近多个目标的索引: Finding the nearest value and return the index of array in Python但是,如果数组 A 中有重复的值。该方法将只返回索引的 1,而不是所有可能的索引。例如这样的数组:

A = array([    1. ,     2. ,     3. ,     3. ,     3.1,     4. ,    50. ,
60. , 70. , 80. , 90. , 100.1, 110. , 120. ,
999. , 1000. ])
targets=[3, 100]

它将返回 idx = [2, 11]但我希望它返回 [[2,3],11]我能做的就是遍历 idx 以获得 bool 索引,例如 [A==A[idx[0]],A==A[idx[1]],...]但如果目标数组非常大,这可能会非常低效。

一件事是我可以首先使用 numpy.unique() 找到唯一的数组集。找到所有相同的值。然后在该唯一数组上搜索排序(),这可能会节省一些时间。然后我可以使用这个索引来找到所有相同的值。

这是一个例子:

def find_closest_multiTargets_inSortred(A,targets):
#A must be sorted
idx = A.searchsorted(targets)
idx = npy.clip(idx, 1, len(A)-1)
left = A[idx-1]
right = A[idx]
idx -= targets - left < right - targets
return idx

def find_closest_multiTargets_Allrepeats(A,targets):
ua=npy.unique(A)
_uaIdxs=find_closest_multiTargets_inSortred(ua, targets)
return [npy.where(A==ua[_i]) for _i in _uaIdxs]

>>> find_closest_multiTargets_Allrepeats([5.1,5.5,4,1,2.3,5.1,6],[2,5])
[(array([4]),), (array([0, 5]),)]

我想,如果len(ua)<<len(A)这将比尝试直接在 A 上找到最接近的更有效率。但是,npy.where 步骤仍然循环遍历 _uaIdxs,如果它很大,那么它会非常低效。如果可以构建替代的 unique(),以获得 A 中每个唯一值的索引列表([[索引具有值 ua[0]],[索引具有值 ua[2]]...])。它会更有效率:

def find_closest_multiTargets_Allrepeats2(A,targets):
ua,idxList=npy.unique2(A)
_uaIdxs=find_closest_multiTargets_inSortred(ua, targets)
return idxList[_uaIdxs]

但我不知道是否有什么可以做 unique2() 期望做的事情。除了 searchsorted 之外,可能还有其他完全不同的算法可以以更有效的方式获得相同的结果。

为简单起见,我们假设 A 已排序。对于未排序的数组 A,我们总是可以先对其进行 argsort。

有没有人可以提供一种更有效的方法来做到这一点?

谢谢!

最佳答案

您可以执行以下操作:

a = np.array([1., 2., 3., 3., 3.1, 4., 50., 60., 70., 80., 90., 100.1, 110., 120., 999., 1000.])
t = np.array([3, 100])
  • 计算成对距离:

    d = np.abs(np.subtract.outer(a, t))

  • 找到最接近的值:

    asort = np.argsort(d, axis=0)

  • 获取最接近的索引和最接近的值:
    ind = np.arange(a.shape[0])
    print(ind[asort][0])
    #array([ 2, 11], dtype=int64)<br/>
    print(a[asort][0])
    #array([ 3. , 100.1])

请注意,如果您在最后一步中使用 [0] 以外的其他索引 [i],您将获得第 i 个最接近的值...使用 [0] 将产生最接近的值。

关于python - 找到所有接近目标的值,如 numpy.searchsorted() 但返回所有相同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24519013/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com