拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 如何使用interpn在资料帧中进行插值?

如何使用interpn在资料帧中进行插值?

白鹭 - 2022-03-17 2114 0 0

我正在尝试插入一个资料框,但没有运气。我有一个带有距离标头和我正在使用的风分量标头的资料框。

风分量以20单位差和距离为10我希望能够在1每个单元内进行插值,但我被卡住了。

在此之前我没有使用过 Scipy,我在他们的档案中看不到太多解释(我能理解)。

我有一个表,我转换to_dict并将其用于资料框:

data = {'dist': [100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280, 290, 300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 410, 420],
     '-60': [520, 600, 670, 740, 810, 880, 950, 1020, 1100, 1170, 1240, 1310, 1380, 1450, 1520, 1600, 1670, 1740, 1810, 1880, 1950, 2020, 2100, 2170, 2240, 2310, 2380, 2450, 2530, 2600, 2670, 2740, 2810],
     '-40': [440, 500, 570, 630, 690, 760, 820, 880, 950, 1010, 1070, 1140, 1200, 1260, 1330, 1390, 1450, 1510, 1580, 1640, 1700, 1770, 1830, 1890, 1960, 2020, 2080, 2150, 2210, 2270, 2340, 2400, 2460],
     '-20': [380, 430, 490, 550, 600, 660, 720, 770, 830, 880, 940, 1000, 1050, 1110, 1170, 1220, 1280, 1340, 1390, 1450, 1510, 1560, 1620, 1680, 1730, 1790, 1850, 1900, 1960, 2020, 2070, 2130, 2190],
     '0': [320, 370, 420, 480, 530, 580, 630, 680, 730, 780, 830, 890, 940, 990, 1040, 1090, 1140, 1190, 1240, 1300, 1350, 1400, 1450, 1500, 1550, 1600, 1650, 1710, 1760, 1810, 1860, 1910, 1960],
     '20': [280, 320, 370, 420, 470, 510, 560, 610, 650, 700, 750, 790, 840, 890, 930, 980, 1030, 1070, 1120, 1170, 1210, 1260, 1310, 1350, 1400, 1450, 1500, 1540, 1590, 1640, 1680, 1730, 1780],
     '40': [240, 280, 330, 370, 410, 460, 500, 540, 590, 630, 670, 720, 760, 800, 840, 890, 930, 970, 1020, 1060, 1100, 1150, 1190, 1230, 1280, 1320, 1360, 1400, 1450, 1490, 1530, 1580, 1620],
     '60': [210, 250, 290, 330, 370, 410, 450, 490, 530, 570, 610, 650, 690, 730, 770, 810, 850, 890, 930, 970, 1010, 1050, 1090, 1130, 1170, 1210, 1250, 1290, 1330, 1370, 1410, 1450, 1490]}
df = pd.DataFrame(data).set_index(['dist'])
df.columns = df.columns.map(float)
df.columns.name = 'wind'
print(df)

打印这给了我:

wind  -60.0  -40.0  -20.0   0.0    20.0   40.0   60.0
dist                                                 
100     520    440    380    320    280    240    210
110     600    500    430    370    320    280    250
120     670    570    490    420    370    330    290
130     740    630    550    480    420    370    330
140     810    690    600    530    470    410    370
150     880    760    660    580    510    460    410
160     950    820    720    630    560    500    450
170    1020    880    770    680    610    540    490
180    1100    950    830    730    650    590    530
190    1170   1010    880    780    700    630    570
200    1240   1070    940    830    750    670    610
210    1310   1140   1000    890    790    720    650
220    1380   1200   1050    940    840    760    690
230    1450   1260   1110    990    890    800    730
240    1520   1330   1170   1040    930    840    770
250    1600   1390   1220   1090    980    890    810
260    1670   1450   1280   1140   1030    930    850
270    1740   1510   1340   1190   1070    970    890
280    1810   1580   1390   1240   1120   1020    930
290    1880   1640   1450   1300   1170   1060    970
300    1950   1700   1510   1350   1210   1100   1010
310    2020   1770   1560   1400   1260   1150   1050
320    2100   1830   1620   1450   1310   1190   1090
330    2170   1890   1680   1500   1350   1230   1130
340    2240   1960   1730   1550   1400   1280   1170
350    2310   2020   1790   1600   1450   1320   1210
360    2380   2080   1850   1650   1500   1360   1250
370    2450   2150   1900   1710   1540   1400   1290
380    2530   2210   1960   1760   1590   1450   1330
390    2600   2270   2020   1810   1640   1490   1370
400    2670   2340   2070   1860   1680   1530   1410
410    2740   2400   2130   1910   1730   1580   1450
420    2810   2460   2190   1960   1780   1620   1490

到目前为止一切都很好。现在我所困扰的是如何进行插值,以便我可以从中获得准确的数字。我正在尝试使用,interpn但显然我做错了。这是我正在做的尝试获取风分量为-35和距离为的插值图103

arr = np.dstack(np.array_split(df.to_numpy(), 1))
wind = df.columns.to_numpy()
dist = df.index.get_level_values(0).unique().to_numpy()

print(interpn((wind, dist), arr, [float(-35), int(103)]))

我收到以下错误:

ValueError: There are 7 points and 33 values in dimension 0

我曾尝试通读档案,但似乎无法理解它,我在其他地方找到的所有示例都用于图形资料。

有人可以帮我解决这个问题,我对这种作业很陌生。谢谢 :)

uj5u.com热心网友回复:

无需转换您的资料,您已经拥有一个二维阵列并且可以按原样使用它。您弄错了轴:第一个轴(轴 0)是资料框的行,第二个轴(轴 1)是列。

arr = df.to_numpy()
dist = df.index.to_numpy()
wind = df.columns.to_numpy()

x, y = np.meshgrid(wind, dist)
print(interpn((dist, wind), arr, [103, -35]))
# array([442.25])

作为替代方案,您也可以使用itnerp2d,这里是相反的轴:

f = interp2d(wind, dist, arr)
print(f(-35, 103))
#array([442.25])
标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *