Ниже приведен небольшой пример кода, который пытается интерполировать сигналы крышки EEG. В этом примере колпачок EEG имеет 44 канала/электрода и 1125 временных меток для каждого из каналов. Кроме того, имеется 800 образцов, которые содержат 1125 временных меток из 44 каналов/электродов.
Я попробовал интерполяцию RBF от scipy, но, похоже, она очень медленная.
Обратите внимание, что координаты электрода нужно только развернуть.
Как я могу улучшить код, чтобы интерполяция была быстрее? Я открыт для рассмотрения другого метода интерполяции/приближения.
import numpy as np
from scipy.interpolate import Rbf
x = np.random.rand(44,1)
y = np.random.rand(44,1)
z = np.random.rand(44,1)
xR = np.random.rand(44,1)
yR = np.random.rand(44,1)
zR = np.random.rand(44,1)
time_series = np.random.rand(800,44,1125)
time_series_rotated = np.zeros((800,44,1125))
total_time_steps = time_series.shape[2]
total_samples = time_series.shape[0]
for s in range(total_samples):
for t in range(total_time_steps):
rbfi = Rbf(x, y, z, time_series[s,:,t], function="quintic")
time_series_rotated[s,:,t] = np.squeeze(rbfi(xR, yR, zR))
griddata
принимают многомерные массивы как значения, поэтому вы можете напрямую писать:
from scipy.interpolate import griddata
nbr_electrodes = 44
nbr_samples = 800
nbr_timestamps = 125 # to be testable
xyz = np.random.rand(nbr_electrodes, 3)
xyz_rotated = np.random.rand(nbr_electrodes, 3)
time_series = np.random.rand(nbr_electrodes, nbr_timestamps, nbr_samples)
time_series_rotated = griddata(xyz, time_series, xyz_rotated, method='linear')
Обратите внимание, что точки (электроды) теперь находятся в первом измерении. Он занимает менее 100 мс на моем компьютере против более чем 1 с для метода цикла.
time_series_rotated.shape
дает (44, 125, 800)