数组插值 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]=10
和 T[1]=20
如何创建一个用 X、T 数组和“距离”/比率插值的新数组T_user
到 T[0]=10
和 T[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)
我有一个程序,我希望用户可以根据需要选择温度 (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]=10
和 T[1]=20
如何创建一个用 X、T 数组和“距离”/比率插值的新数组T_user
到 T[0]=10
和 T[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,])