Skip to main content
 首页 » 编程设计

python之相对于第二个数组查找并替换 numpy 数组中最接近的值

2025年05月04日21bonelee

我有一个大的 2D np.array (vec)。 我想用较短的数组 vals 中最接近的值替换 vec 中的每个值。

我试过以下方法

replaced_vals=vals[np.argmin(np.abs(vec[:, np.newaxis] - vals), axis=0)] 

但它不起作用,因为 vec 和 vals 的大小不同。

示例输入

vec = np.array([10.1,10.7,11.4,102,1100] 
vals = np.array([10.0,11.0,100.0]) 

期望的输出:

replaced_vals = [10.0,11.0,11.0,100.0,100.0] 

请您参考如下方法:

如果您的 vals 数组已排序,则可以通过 np.searchsorted 获得更高效的内存,并且通常更高效的解决方案。 :

def jpp(vec, vals): 
    ss = np.searchsorted(vals, vec) 
    a = vals[ss - 1] 
    b = vals[np.minimum(len(vals) - 1, ss)] 
    return np.where(np.fabs(vec - a) < np.fabs(vec - b), a, b) 
 
vec = np.array([10.1,10.7,11.4,102,1100]) 
vals = np.array([10.0,11.0,100.0]) 
 
print(jpp(vec, vals)) 
 
[  10.   11.   11.  100.  100.] 

性能基准测试

# Python 3.6.0, NumPy 1.11.3 
 
n = 10**6 
vec = np.array([10.1,10.7,11.4,102,1100]*n) 
vals = np.array([10.0,11.0,100.0]) 
 
# @ThomasPinetz's solution, memory inefficient 
def tho(vec, vals): 
    return vals[np.argmin(np.abs(vec[:, np.newaxis] - vals), axis=1)] 
 
def jpp(vec, vals): 
    ss = np.searchsorted(vals, vec) 
    a = vals[ss - 1] 
    b = vals[np.minimum(len(vals) - 1, ss)] 
    return np.where(np.fabs(vec - a) < np.fabs(vec - b), a, b) 
 
# @Divakar's solution, adapted from first related Q&A link 
def diva(A, B): 
    L = B.size 
    sorted_idx = np.searchsorted(B, A) 
    sorted_idx[sorted_idx==L] = L-1 
    mask = (sorted_idx > 0) & \ 
    ((np.abs(A - B[sorted_idx-1]) < np.abs(A - B[sorted_idx])) ) 
    return B[sorted_idx-mask] 
 
assert np.array_equal(tho(vec, vals), jpp(vec, vals)) 
assert np.array_equal(tho(vec, vals), diva(vec, vals)) 
 
%timeit tho(vec, vals)   # 366 ms per loop 
%timeit jpp(vec, vals)   # 295 ms per loop 
%timeit diva(vec, vals)  # 334 ms per loop 

相关问答

  1. Find nearest indices for one array against all values in another array - Python / NumPy
  2. Find nearest value in numpy array