2010-07-15 6 views
2

Je le tableau numpy suivant:interpolation linéaire sur une matrice 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+ 

si un utilisateur entre ay (exemple 2.5) Je out mettre trois valeurs, une pour A, B, et C:

dans mon exemple a: .19, B: 0,57, C: .24

Plus Exemples:

Y  A  B  C 
0.2 .20 .54 .26 
1.5 .215 .55 .245 
4.0 .17 .62 .21 
8.7 .17 .62 .21 

L'utilisateur va entrer dans une multipl e des valeurs y en tant que tableau numpy. le résultat devrait être un tableau aussi bien

Je l'ai fait et des morceaux de bits du code par exemple

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

Je suppose aussi que scipy.ndimage/map_coordinates convient le mieux à mes besoins plutôt que scipy .interpolate mais je peux me tromper

+0

Devrait-il être 'B: .57'? – unutbu

+0

Correction, merci :) – dassouki

+0

duplication possible de [interpolation Scipy sur un tableau numpy] (http://stackoverflow.com/questions/3057015/scipy-interpolation-on-a-numpy-array) –

Répondre

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

et si l'axe y est différent de 0 à 4 – dassouki

2

Il pourrait y avoir une meilleure façon en utilisant scipy.ndima ge, mais voici comment vous pouvez le faire avec 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 ]] 
Questions connexes