插值类对象

时间:2016-10-24 14:44:31

标签: python scipy interpolation

我有一个简单的Point类,如下所示

class Point(object):
    def __init__(self, x=0.0, y=0.0, z=0.0):
        self.x = x
        self.y = y
        self.z = z

我想使用scipy.interpolate.interp1d来插入这些点作为时间的函数,例如。

x,y,z = f(t)

然而,当我尝试以下小例子时

import numpy as np
from scipy.interpolate import interp1d

times = np.array([0.0, 0.1, 0.2])
points = np.array([Point(0.0, 0.0, 0.0),
                   Point(1.0, 1.0, 1.0),
                   Point(2.0, 2.0, 2.0)])

function = interp1d(times, points)

new_point = function(0.05)

我收到以下错误

Traceback (most recent call last):
  File "D:/example.py", line 31, in <module>
    function = interp1d(times, points)
  File "C:\long_path\scipy\interpolate\interpolate.py", line 439, in __init__
    y = y.astype(np.float_)
TypeError: float() argument must be a string or a number, not 'Point'

我也尝试重载Point类的算术运算符(例如__add____sub____truediv__),虽然这似乎没有帮助。< / p>

有没有办法可以scipy.interpolate.interp1d使用我的班级?

1 个答案:

答案 0 :(得分:3)

由于python对象是内部dicts而不是连续缓冲区,因此当自定义类型对象位于numpy.ndarray内时,numpy / scipy将无法使用某些方法。

一个简单的解决方案是将所有Point放入一个内置类型的ndarray中:

from __future__ import print_function
import numpy as np
import scipy.interpolate as sp_interp
points = np.array([[0.0, 0.0, 0.0],
                   [1.0, 1.0, 1.0],
                   [2.0, 2.0, 2.0]], dtype='float64')
times = np.linspace(0.,.2, len(points))

fn_interp = sp_interp.interp1d(times, points, axis=0)
print(fn_interp(0.05))

如果您致力于基于类的方法,则可能需要定义自定义dtype或创建ndarray的子类,如已回答here