2010-07-15 61 views
2

我有以下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+ 

如果用戶輸入AY(例如,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 

用戶將輸入一個含多處作爲一個numpy數組的y值。結果應該是一個數組以及

我做過位和碼片例如

#boundaries: 
y[y < 0] = 0 
y[y > 4] = 4 

我也假設scipy.ndimage/map_coordinates最能滿足我的需求,而不是SciPy的.interpolate但我可能是錯的

+0

它應該是'B:.57'嗎? – unutbu 2010-07-15 13:18:54

+0

修正了,謝謝:) – dassouki 2010-07-15 13:19:45

+0

[numpy數組上的Scipy插值]的可能重複(http://stackoverflow.com/questions/3057015/scipy-interpolation-on-a-numpy-array) – 2010-07-15 14:34:47

回答

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] 
+0

之上,如果y軸不同於0到4 – dassouki 2010-09-16 03:42:31

2

有可能是使用scipy.ndima一個更好的辦法ge,但是這裏是你如何使用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 ]]