Интерполировать целые массивы комплексных чисел
У меня есть несколько двумерных массивов np.arrays (все одинакового размера), содержащих комплексные числа. Каждый из них принадлежит одной позиции в 4-мерном пространстве. Эти позиции редки и распределены неравномерно (если быть точным, латинский гиперкуб). Я хотел бы интерполировать эти данные в другие точки в том же 4-мерном пространстве.
Я могу успешно сделать это для простых чисел, используя либоsklearn.kriging()
, scipy.interpolate.Rbf()
(или другие):
# arrayof co-ordinates: 2 4D sets
X = np.array([[1.0, 0.0, 0.0, 0.0],\
[0.0, 1.0, 0.0, 0.0]])
# two numbers, one for each of the points above
Y = np.array([1,\
0])
# define the type of gaussian process I want
kriging = gp.GaussianProcess(theta0=1e-2, thetaL=1e-4, thetaU=4.0,\
corr='linear', normalize=True, nugget=0.00001, optimizer='fmin_cobyla')
# train the model on the data
kmodel = kriging.fit(X,Y)
# interpolate
kmodel.predict(np.array([0.5, 0.5, 0.0, 0.0]))
# returns: array([ 0.5])
Если я пытаюсь использовать массивы (или просто комплексные числа) в качестве данных, это не сработает:
# two arrays of complex numbers, instead of the numbers
Y = np.array([[1+1j, -1-1j],\
[0+0j, 0+0j]])
kmodel = kriging.fit(X,Y)
# returns: ValueError: The number of features in X (X.shape[1] = 1) should match the sample size used for fit() which is 4.
Это очевидно, так как документация дляkriging.fit()
ясно утверждает, что ему нужен массив из n скаляров, по одному на каждый элемент в первом измерении X.
Одно из решений состоит в том, чтобы разложить массивы в Y на отдельные числа, а именно на действительные и мнимые части, сделать отдельную интерполяцию каждого из них и затем снова собрать их вместе. Я могу сделать это с правильной комбинацией циклов и некоторой артистичностью, но было бы хорошо, если бы был метод (например, вscipy.interpolate
), который может обрабатывать весь массив np.array вместо скалярных значений.
Я не зафиксирован на конкретном алгоритме (пока), поэтому я был бы рад узнать о любом, который может использовать массивы комплексных чисел в качестве «переменной» для интерполяции. Поскольку - как я уже сказал - в пространстве мало и нерегулярных точек (и нет сетки для интерполяции), простая линейная интерполяция, конечно, не подойдет.