避免NumPy 1D最近邻中的for循环

xpcnnkqh  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(129)

我有以下代码,其中我得到了1D中的N个最近邻居:

import numpy as np

def find_nnearest(arr, val, N):
    idxs = []
    for v in val:
        idx = np.abs(arr - v).argsort()[:N] 
        idxs.append(idx)
    return np.array(idxs)

A = np.arange(10, 20)
test = find_nnearest(A, A, 3)
print(test)

字符串
它显然使用了一个for循环来获取idx的。有没有一种numpythonic的方法来避免这种for循环(但返回相同的数组)?

q9rjltbz

q9rjltbz1#

为了回答你的问题,是的,你可以通过避免显式的for-loop来使代码更“numpythonic”。你可以使用广播来计算整个数组arr和数组val之间的绝对差。下面是你的代码的更新版本:

import numpy as np

def find_nnearest(arr, val, N):
    idxs = np.abs(arr[:, None] - val).argsort(axis=0)[:N]
    return idxs

A = np.arange(10, 20)
test = find_nnearest(A, A, 3)
print(test)

字符串
在这个版本中,arr[:, None]arr引入了一个新的轴,使其成为一个2D数组,其中每行对应于arr中的一个元素。广播然后负责在一个步骤中计算arrval之间所有元素组合的绝对差。代码的其余部分保持类似,但是现在索引是使用axis=0来完成的,以指定应当沿新轴沿着完成排序。

相关问题