我有以下代码,其中我得到了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循环(但返回相同的数组)?
1条答案
按热度按时间q9rjltbz1#
为了回答你的问题,是的,你可以通过避免显式的
for
-loop来使代码更“numpythonic”。你可以使用广播来计算整个数组arr
和数组val
之间的绝对差。下面是你的代码的更新版本:字符串
在这个版本中,
arr[:, None]
为arr
引入了一个新的轴,使其成为一个2D数组,其中每行对应于arr
中的一个元素。广播然后负责在一个步骤中计算arr
和val
之间所有元素组合的绝对差。代码的其余部分保持类似,但是现在索引是使用axis=0
来完成的,以指定应当沿新轴沿着完成排序。