Нахождение ближайшего расстояния между точками в 3D и 2D массивах - PullRequest
0 голосов
/ 23 марта 2019

Ранее я задавал похожий вопрос ( Нахождение ближайшего к значению в двух наборах данных с использованием цикла for ?), Но теперь я нахожусь в другом затруднительном положении, поскольку столкнулся с несколько иной проблемой, какТретье измерение было добавлено, потому что у меня есть два независимых параметра, которые меняются.

import numpy as np
import math

f_exp = np.array([1, 1.6, 2.7, 4.4, 7.3, 12, 20, 32, 56, 88, 144, 250000])
e_exp = np.array([7.15, 7.30, 7.20, 7.25, 7.26, 7.28, 7.32, 7.25, 7.35, 7.34, 7.37, 13.55])

n_e_exp = len(e_exp)

ezero   = 7.15
einf    = 13.55
fc      = np.arange(1,11000,1000)
alpha   = np.arange(0,1.1,0.1)

log_f_mod = np.arange(-3, 6.5, 0.5)
f_mod     = 10 ** log_f_mod

n_f_mod = len(f_mod)
n_fc    = len(fc)
n_alpha = len(alpha)  

x       = np.zeros((n_f_mod, n_fc))
eR      = np.zeros((n_alpha, n_f_mod, n_fc))
eI      = np.zeros((n_alpha, n_f_mod, n_fc))
e_mod   = np.zeros((n_alpha, n_f_mod, n_fc))
invQ    = np.zeros((n_alpha, n_f_mod, n_fc))
for i in range(n_alpha):
    for j in range(n_f_mod):
        for k in range(n_fc):
            x[j,k]       = np.log(f_mod[j] / fc[k])
            eR[i,j,k]    = einf + 1/2 * (ezero - einf) * (1 - np.sinh((1 - alpha[i]) * x[j,k]) / (np.cosh((1 - alpha[i]) * x[j,k]) + np.cos(alpha[i] * math.pi / 2))) 
            eI[i,j,k]    = np.abs(1/2 * (ezero - einf) * np.cos(alpha[i] * math.pi / 2) / (np.cosh((1 - alpha[i]) * x[j,k]) + np.sin(alpha[i] * math.pi / 2)))
            e_mod[i,j,k] = np.sqrt(eR[i,j,k] ** 2 + eI[i,j,k] ** 2)
            invQ[i,j,k]  = eI[i,j,k] / eR[i,j,k]

Пока все хорошо, я успешно рассчитал все сценарии eR, eI, e_abs и invQ, как функции x и alpha (независимые параметры, которые меняются).Теперь мне нужно подогнать e_mod к e_exp, найдя значения x и alpha, при которых e_mod находится ближе всего к e_exp.В моем предыдущем вопросе у меня была только одна независимая переменная, поэтому я смог что-то вроде этого:

index = np.zeros((n_e_exp, n_fc), dtype=int)
value = np.zeros((n_e_exp, n_fc))
for l in range(n_fc):
    for m in range(n_e_exp):
        index[m,l] = np.argmin(np.abs(np.sqrt((e_abs[:,l] - e_exp[m]) ** 2 + (f_mod[:] - f_exp[m]) ** 2))
        value[m,l] = np.min(np.abs(np.sqrt((e_abs[:,l] - e_exp[m]) ** 2 + (f_mod[:] - f_exp[m]) ** 2)[index[m,l]]))

BFE = [np.sum(value[:,_]) for _ in range(n_fc)]

M = np.min(BFE)
I = np.array(np.where(M == BFE))
I = I[0]

Затем я попытался сделать его 3D:

n_e_abs = len(e_abs)

index = np.zeros((n_e_abs, n_e_exp, n_fc), dtype=int)
value = np.zeros((n_e_abs, n_e_exp, n_fc))

for a in range(n_e_abs):    
    for m in range(n_e_exp):
        for l in range(n_fc):
            index[a,m,l] = np.argmin(np.abs(np.sqrt((e_abs[a,:,l] - e_exp[m]) ** 2 + (f_mod[:] - f_exp[m]) ** 2)))
            value[a,m,l] = np.min(np.abs(np.sqrt((e_abs[a,:,l] - e_exp[m]) ** 2 + (f_mod[:] - f_exp[m]) ** 2)[index[a,m,l]]))

    BFE = [np.sum(value[:,_]) for _ in range(n_fc)]

    M = np.min(BFE)
    I = np.array(np.where(M == BFE))
    I = I[0]
  • Как мне перевести приведенный выше код наилучшего соответствия для работы с трехмерными массивами, где цель состоит в том, чтобы найти и индексы, и значения fc и alpha?

, которые мне нужно найтиоба они, так что я могу построить e_exp против f_exp и ближайшую к версии e_mod против f_mod на одном графике, что является конечной целью.

Я прошу прощения за действительно конкретный вопрос, я попытался сделать его более обобщенным и упрощенным без какой-либо удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...