【问题标题】:3D interpolation between two cloud of points两点云之间的 3D 插值
【发布时间】:2019-08-20 17:11:51
【问题描述】:

我想在不同的网格上插入一组在 CFD 模拟网格的每个节点上定义的温度。

原始数据集中的数据在 csv (X1,Y1,Z1,T1) 中,我想在 X2,Y2,Z2 网格上找到新的 T2 值。

从 SCIPY 为我们提供的众多可能性中,哪个更适合该应用?线性方法和最近节点方法有哪些区别?

感谢您的宝贵时间。

编辑

这是一个例子:

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]])))

此代码正在运行,但我有一个包含 1000 万个点的数据集,要在相同大小的数据集上进行插值。

问题是这个操作对我的所有观点来说都很慢:有没有办法改进我的代码?

我使用了 LinearNDinterpolator,因为它似乎比 NearestNDInterpolator (LinearVSNearest) 更快。

【问题讨论】:

  • 您能否向我们提供您正在尝试做的示例代码?你给了我们一个基本的描述,但还不足以真正起作用。看到你已经给了这个旧大学的尝试,这对我们也很有帮助。
  • 对不起,你是对的:我会尽快提供一个例子——连同一些测试。我希望有一些初步的建议,但是看着我收到的“-3”,我认为这是不可能的。感谢您的宝贵时间。
  • 你的网格规则吗?在这种情况下,您可以使用RegularGridInterpolator,这样会更快
  • Mstaino,不幸的是我的网格不规则!

标签: python scipy


【解决方案1】:

一种解决方案是使用 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])

【讨论】:

  • 感谢您的回答!不幸的是,我的网格非常不规则。你能更好地解释一下间隔的方法吗? “减少数据大小”是什么意思?谢谢
  • 嗨,我建议的方法只是通过“下采样”来减少点的数量。使用argsort 获取数据的顺序,并选择 10-50-100(您的选择)点的间隔。由于您有三个维度,因此请使用 % 和 any() 运算符来确保每个维度的间距正确。或者,选择随机点(我建议的方法速度较慢,但​​会产生更规则分布的子网格)
猜你喜欢
  • 1970-01-01
  • 2018-01-07
  • 1970-01-01
  • 2022-12-11
  • 2020-03-29
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2013-05-07
相关资源
最近更新 更多