2010-07-15 4 views
2

У меня есть следующий 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+ 

если пользователь вводит ау (пример, 2.5) следует из положить три значения, один для A, B и C:

в моем примере А: .19, в: 0,57, с: .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 

пользователь будет вводить в Умножить e значений y в виде массива numpy. результат должен быть массивом, а

Я делал биты и куски кода, например

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

Я также предполагая, что scipy.ndimage/map_coordinates будет наилучшим образом соответствует моим требованиям, а не SciPy .interpolate, но я мог бы быть неправильно

+0

Должно ли это быть 'B: .57'? – unutbu

+0

Исправлено, спасибо :) – dassouki

+0

Возможный дубликат [Scipy интерполяция на массив numpy] (http://stackoverflow.com/questions/3057015/scipy-interpolation-on-a-numpy-array) –

ответ

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

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