考慮我有 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 索引位置都有匹配,下一個為 1,arr2[1]==0,并被跳過,因為 arr2[2]==1 下一個值為 1,這里下一個值為2,arr2 沒有像 arr1 那樣的三、3 值,并且從 arr2 使用 2,3,4 以最適合 arr1。
我怎樣才能從 2 個陣列中獲得所需的輸出?這不是插值問題。這個問題有具體的名稱嗎?我不確定如何查找。
uj5u.com熱心網友回復:
find_nearest從這里偷來的,并稍微修改了您對平局的定義,使其達到兩個可能值中的較低值。
使用它,每次找到最接近的值時,它也會從可能的值中洗掉該值。
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]
筆記:
- 您的第二個變體輸出是不可能的,因為
2它的arr2.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/469089.html
下一篇:使用for回圈查找陣列中的元素
