查找数值数组 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_nearest
从 here 中窃取并略微修改了您对平局的定义,该平局将变为两个可能值中较低的值。
使用这个,每次找到最近的值时,它也会从可能的值中删除该值。
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
。
假设我有 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_nearest
从 here 中窃取并略微修改了您对平局的定义,该平局将变为两个可能值中较低的值。
使用这个,每次找到最近的值时,它也会从可能的值中删除该值。
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
。