эффективная 3D-интерполяция / аппроксимация в Scipy (Python)

1

Ниже приведен небольшой пример кода, который пытается интерполировать сигналы крышки 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))
Теги:
numpy
scipy
interpolation
approximation

1 ответ

0

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)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню