Два предположения: 1: Вы ищете не ближайшего соседа, а все высоты в пределах некоторого диапазона.Итак, допустим, что для a1 вы хотите, чтобы все bn были в пределах 0.5 от a1 (давая вам b1 и b2 в соответствии с вашим примером).Я бы определил «ближайшего соседа» как нечто иное.
2: Вы не учитываете nan в своих медианах (numpy считает их бесконечностью согласно некоторому соглашению IEEE, но мне это кажется странным).Таким образом, согласно вашему предложению мы используем nanmedian из scipy.stats.
Я бы сделал следующее:
from numpy import *
from pylab import *
A_Alt = array([1,2,3,4])
A_Val = array([.33, .5, .6, .8])
B_Alt = array([.7, 0.9, 1.7, 2., 2.4, 2.9, 3.1, 3.2, 3.9, 4.1])
B_Val = array([.3, NaN, .8, .6, .7, .4, .3, NaN, .99, 1.3])
range = .5
B_Agrid = [nanmedian(B_Val[abs(B_Alt - k)<range]).item() for k in A_Alt]
A_Bgrid = [nanmedian(A_Val[abs(A_Alt - k)<range]).item() for k in B_Alt]
Мы найдем все индексы, где расстояние от B_Alt до k в A_Alt меньшеуказанный диапазон.Затем мы берем медиану тех B_Val.То же самое работает для A_Bgrid с результатами в соответствии с запросом.
== Редактировать ==
Другое предположение относительно ваших ближайших соседей: Давайте возьмем запись ближайшего соседа (или записи в случае, еслисвязи) с наименьшим абсолютным перепадом высот, не имея значения nan в качестве значения nan.Примечание: эти результаты не соответствуют вашему примеру, так как b1 не будет ближайшим соседом a1 из-за того, что b2 ближе.
При этом предположении должен работать следующий код:
from numpy import *
from pylab import *
from scipy.stats import nanmedian
A_Alt = array([1,2,3,4])
A_Val = array([.33, .5, .6, .8])
B_Alt = array([.7, 0.9, 1.7, 2., 2.4, 2.9, 3.1, 3.2, 3.9, 4.1])
B_Val = array([.3, NaN, .8, .6, .7, .4, .3, NaN, .99, 1.3])
def ReGridMedian(AltIn, ValIn, AltOut):
part = isfinite(ValIn)
q = [abs(AltIn[part]-k) for k in AltOut]
q = [nonzero(abs(k - min(k))<3*finfo(k.dtype).eps) for k in q]
q = [ValIn[part][k] for k in q]
return [median(k) for k in q]
B_Agrid = ReGridMedian(B_Alt, B_Val, A_Alt)
A_Bgrid = ReGridMedian(A_Alt, A_Val, B_Alt)
Я взломал что-то, что проверяет, совпадают ли два значения в точности машины, но я предполагаю, что есть лучший способ сделать это.В любом случае мы сначала фильтруем все значения, отличные от nan, затем находим наиболее близкое соответствие, затем проверяем наличие дублирующих минимумов, а затем получаем медиану этих значений.
====
Это охватывает ваш вопрос, или мои предположения неверны?