我有一个简单的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
使用我的班级?
答案 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