查找数值数组 Python 的匹配项

Find match of numeric arrays Python

假设我有 2 个数组。 arr2 总是比 arr1 长。我想将 arr2 中的值降低到最适合 arr1 的值。如果 arr2 没有与 arr1 相等的值,它将需要是仍然在 arr2 中的最接近的值。

example 1:
arr1 = [0, 1, 1, 3, 3, 3, 5]
arr2 = [0, 0, 1, 1, 1, 2, 3, 4, 4, 5, 5, 5]
output: [0, 1, 1, 2, 3, 4, 5]

example 2:
arr1 = [0, 1, 2, 3, 4, 5]
arr2 = [1, 1, 3, 3, 3, 3, 4, 4, 5, 5]
output: [1, 1, 3, 3, 4, 5]
# here output[0] must be 1, because arr2 does not have a 0 value

example 3:
arr1 = [3, 4, 5, 7]
arr2 = [0, 0, 2, 2, 2, 5, 8]
output: [2, 2, 5, 8]

观察输出。 第一个值为 0,两者都在 0 索引位置匹配 next是1,arr2[1]==0,因为arr2[2]==1而被跳过 下一个值也是 1 这里的下一个值是 2,arr2 没有像 arr1 那样的三个 3 值,并且 arr2 使用 2,3,4 来最适合 arr1。

如何从 2 个数组中获得所需的输出?这不是插值问题。这个问题有具体的名称吗?我不确定如何查找。

find_nearesthere 中窃取并略微修改了您对平局的定义,该平局将变为两个可能值中较低的值。

使用这个,每次找到最近的值时,它也会从可能的值中删除该值。

import numpy as np
import math

def find_nearest(array,value):
    idx = np.searchsorted(array, value, side="left")
    if idx > 0 and (idx == len(array) or math.fabs(value - array[idx-1]) <= math.fabs(value - array[idx])):
        return array[idx-1]
    else:
        return array[idx]

def nearest_no_replacement(array1, array2):
    array = array2.copy()
    new_arr = []
    for x in array1:
        c = find_nearest(array, x)
        new_arr.append(c)
        array.remove(c)
    return new_arr

arr1 = [0, 1, 1, 3, 3, 3, 5]
arr2 = [0, 0, 1, 1, 1, 2, 3, 4, 4, 5, 5, 5]
result1 = nearest_no_replacement(arr1, arr2)

arr1 = [0, 1, 2, 3, 4, 5]
arr2 = [1, 1, 3, 3, 3, 3, 4, 4, 5, 5]
result2 = nearest_no_replacement(arr1, arr2)

arr1 = [3, 4, 5, 7]
arr2 = [0, 0, 2, 2, 2, 5, 8]
result3 = nearest_no_replacement(arr1, arr2)

print(f'r1: {sorted(result1)}', f'r2: {sorted(result2)}', f'r3: {sorted(result3)}', sep='\n')

输出:

r1: [0, 1, 1, 2, 3, 4, 5]
r2: [1, 1, 3, 3, 4, 5]
r3: [2, 2, 5, 8]

备注:

  • 你的第二个变体输出是不可能的,因为它的 arr2 中没有 2