3D-интерполяция между двумя облаками точек - PullRequest
0 голосов
/ 29 марта 2019

Я хочу интерполировать набор температуры, определенный на каждом узле сетки симуляции CFD, на другую сетку.

Данные из исходного набора находятся в формате csv (X1, Y1, Z1, T1), и я хочу найти новые значения T2 в сетке X2, Y2, Z2.

Из множества возможностей, которые предоставляет нам SCIPY, что больше подходит для этого приложения? Каковы различия между линейным и ближайшим узлом?

Спасибо за ваше время.

EDIT

Вот пример:

import numpy as np
from scipy.interpolate import griddata
from scipy.interpolate import LinearNDInterpolator

data = np.array([
        [ -3.5622760653000E-02,  8.0497122655290E-02,  3.0788827491158E-01],
        [ -3.5854682326000E-02,  8.0591522802259E-02,  3.0784350432341E-01],
        [ -2.8168760240000E-02,  8.0819296043557E-02,  3.0988532075795E-01], 
        [ -2.8413346037000E-02,  8.0890746063578E-02,  3.1002054434659E-01],
        [ -2.8168663383000E-02,  8.0981744777379E-02,  3.1015319609412E-01], 
        [ -3.4150537103000E-02,  8.1385114641365E-02,  3.0865343388355E-01],
        [ -3.4461673349000E-02,  8.1537336777452E-02,  3.0858242919307E-01], 
        [ -3.4285601228000E-02,  8.1655884824782E-02,  3.0877386496235E-01],
        [ -2.1832991391000E-02,  8.0380712111108E-02,  3.0867371621337E-01], 
        [ -2.1933870390000E-02,  8.0335713699008E-02,  3.0867959866155E-01]])

temp = np.array([1.4285955811000E+03,
                 1.4281038818000E+03,
                 1.4543135986000E+03,
                 1.4636379395000E+03,
                 1.4624763184000E+03,                    
                 1.3410919189000E+03,
                 1.3400545654000E+03,
                 1.3505817871000E+03,
                 1.2361110840000E+03,
                 1.2398562012000E+03])

linInter= LinearNDInterpolator(data, temp)
print (linInter(np.array([[-2.8168760240000E-02,  8.0819296043557E-02,  3.0988532075795E-01]])))

этот код работает, но у меня есть набор данных из 10 миллионов точек, которые необходимо интерполировать для набора данных того же размера.

Проблема в том, что эта операция выполняется очень медленно для всех моих пунктов: есть ли способ улучшить мой код?

Я использовал LinearNDinterpolator, потому что он кажется быстрее, чем NearestNDInterpolator ( LinearVSNearest ).

1 Ответ

0 голосов
/ 01 апреля 2019

Одним из решений было бы использование RegularGridInterpolator (если ваша сетка регулярная). Другой подход, который я могу придумать, состоит в том, чтобы уменьшить размер данных, используя интервалы:

step = 4   # you can increase this based on your data size (eg 100)
m = ((data.argsort(0) % step)==0).any(1)
linInter= LinearNDInterpolator(data[m], temp[m])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...