数组插值 python

Interpolation of arrays python

我有一个程序,我希望用户可以根据需要选择温度 (T_user)。知道我有一个温度数组: T=np.array([10,20,30,50,100,150,200])。与 T 中的值相比,我找到了一种获取 T_user 的索引和最接近值的方法。 然后我有 X=np.array([1,2,3,4,5,6])Y=np.array([3,6,9,12,15,18]) 使用 numpy.interp()。现在假设 T_user=12 和 X、Y 分别链接到 T[0]=10T[1]=20 如何创建一个用 X、T 数组和“距离”/比率插值的新数组T_userT[0]=10T[1]=20。如果一点都不清楚,请告诉我。

可以使用apply_along_axis方法:

代码:

import numpy as np

T = np.array([10, 20, 30, 50, 100, 150, 200])
W1 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
W2 = np.array([3, 6, 9, 12, 15, 18, 21, 24, 27, 30])

T_user = 12

# Get the neighbor values
t1 = T[T<=T_user].max(initial=T.min())
t2 = T[T_user<=T].min(initial=T.max())

# Interpolate the values
arr_interp = np.apply_along_axis(lambda e: np.interp(T_user, [t1, t2], e), 1, np.stack([W1, W2]).T)

测试:

f = lambda t: np.apply_along_axis(lambda e: np.interp(t, [T[T<=t].max(initial=T.min()), T[t<=T].min(initial=T.max())], e), 1, np.stack([W1, W2]).T)

T_user = 12
np.testing.assert_array_equal(f(T_user), np.array([1.4, 2.8, 4.2, 5.6, 7.0, 8.4, 9.8, 11.2, 12.6, 14.0]))

T_user = 15
np.testing.assert_array_equal(f(T_user), np.array([ 2.,  4.,  6.,  8., 10., 12., 14., 16., 18., 20.]))

T_user = 31
np.testing.assert_array_equal(f(T_user), np.array([ 1.1,  2.2,  3.3,  4.4,  5.5,  6.6,  7.7,  8.8,  9.9, 11. ]))

T_user = 0
np.testing.assert_array_equal(f(T_user), np.array([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.]))

T_user = 10
np.testing.assert_array_equal(f(T_user), np.array([ 3.,  6.,  9., 12., 15., 18., 21., 24., 27., 30.]))

T_user = 100
np.testing.assert_array_equal(f(T_user), np.array([ 3.,  6.,  9., 12., 15., 18., 21., 24., 27., 30.]))

T_user = 200
np.testing.assert_array_equal(f(T_user), np.array([ 3.,  6.,  9., 12., 15., 18., 21., 24., 27., 30.]))

T_user = 300
np.testing.assert_array_equal(f(T_user), np.array([ 3.,  6.,  9., 12., 15., 18., 21., 24., 27., 30.]))

解释:

如果您有如下最小样本数据集,我的实现中的插值会是什么样子?

T = np.array([10, 20])
W1 = np.array([1,])
W2 = np.array([3,])

# Case.1 (T_user = 12)

# Case.2 (T_user = 5)

# Case.3 (T_user = 10)

# Case.4 (T_user = 25)