在numpy数组上进行线性插值
我有一个这样的numpy数组:
# A B C Y
my_arr = np.array([ [.20, .54, .26], # <0
[.22, .54, .24], # 1
[.19, .56, .25], # 2
[.19, .58, .23], # 3
[.17, .62, .21] ]) # 4+
如果用户输入一个y值(比如2.5),我应该输出三个值,分别对应A、B和C:
在我的例子中,A是0.19,B是0.57,C是0.24
更多例子:
Y A B C
0.2 .20 .54 .26
1.5 .215 .55 .245
4.0 .17 .62 .21
8.7 .17 .62 .21
用户会输入多个y值,作为一个numpy数组。结果也应该是一个数组
我已经写了一些代码的片段,比如:
#boundaries:
y[y < 0] = 0
y[y > 4] = 4
我还在想,使用scipy.ndimage / map_coordinates可能更符合我的需求,而不是scipy.interpolate,但我可能错了
2 个回答
2
可能有更好的方法可以使用scipy.ndimage,但这里是如何使用scipy.interpolate.interp1d来实现的:
import numpy as np
import scipy.interpolate as spi
# A B C Y
my_arr = np.array([ [.20, .54, .26], # 0
[.22, .54, .24], # 1
[.19, .56, .25], # 2
[.19, .58, .23], # 3
[.17, .62, .21] ])
print(my_arr)
Y=np.arange(len(my_arr))
interp_funcs=[spi.interp1d(Y,my_arr[:,col]) for col in range(3)]
y=np.array([2.5,0.2,1.5,4.0,8.7])
y[y < 0] = 0
y[y > 4] = 4
print(np.vstack(f(y) for f in interp_funcs))
# [[ 0.19 0.204 0.205 0.17 0.17 ]
# [ 0.57 0.54 0.55 0.62 0.62 ]
# [ 0.24 0.256 0.245 0.21 0.21 ]]
6
这段内容包含了一些代码和技术讨论,但没有具体的问题或答案。它可能涉及到编程中的某些概念或技巧,适合那些刚开始学习编程的人。
如果你有具体的代码或问题需要解释,可以把它们发给我,我会尽量用简单易懂的方式来帮助你理解。
from scipy import array, ndimage
# A B C Y
m = array([ [.20, .54, .26], # 0
[.22, .54, .24], # 1
[.19, .56, .25], # 2
[.19, .58, .23], # 3
[.17, .62, .21] ]) # 4
inputs = array([-1, 0, 0.2, 1, 1.5, 2, 2.5, 3, 4, 8.7])
inputs[inputs < 0] = 0
inputs[inputs > 4] = 4
for y in inputs:
x = ndimage.map_coordinates(m, [y * numpy.ones(3), numpy.arange(3)], order=1)
print y, x
>>>
0.0 [ 0.2 0.54 0.26]
0.0 [ 0.2 0.54 0.26]
0.2 [ 0.204 0.54 0.256]
1.0 [ 0.22 0.54 0.24]
1.5 [ 0.205 0.55 0.245]
2.0 [ 0.19 0.56 0.25]
2.5 [ 0.19 0.57 0.24]
3.0 [ 0.19 0.58 0.23]
4.0 [ 0.17 0.62 0.21]
4.0 [ 0.17 0.62 0.21]