我正在尝试使用scipy的LinearNDInterpolatorExtrapolate
。
以下最少的代码应尽量简单,但会返回错误
from scipy.interpolate import NearestNDInterpolator
points = [[0,0,0], [1,0,0], [1,1,0],[0,1,0],[.5,.5,1]]
values = [1,2,3,4,5]
interpolator = NearestNDInterpolator(points,values)
interpolator([.5,.5,.8])
返回
TypeError: only integer scalar arrays can be converted to a scalar index
错误似乎来自scipy.interpolate.ndgriddata [source]的第81行。不幸的是,由于我不知道返回的是什么tree.query,我无法进一步追查该错误。
这是一个错误还是我做错了什么?
答案 0 :(得分:0)
只需将没有列表的值作为x值的元组传递
from scipy.interpolate import NearestNDInterpolator
points = [[0,0,0], [1,0,0], [1,1,0],[0,1,0],[.5,.5,1]]
values = [1,2,3,4,5]
interpolator = NearestNDInterpolator(points,values)
interpolator((.5,.5,.8))
# 5
如果您要坚持传递列表,可以使用*
作为
interpolator(*[.5,.5,.8])
要内插多个点,可以map
将内插器插入点(元组)列表中
answer = list(map(interpolator, [(.5,.5,.8), (.05, 1.6, 2.9)]))
# [5, 5]
答案 1 :(得分:0)
将输入作为数组传递
interpolator = NearestNDInterpolator(np.array(points),np.array(
values))
您甚至可以传递很多分数:
interpolator([np.array([.5,.5,.8]),np.array([1,1,2])])
>>>> array([5,5])
答案 2 :(得分:0)
在您的情况下,值类型似乎有问题。由于points
和values
的第一个值是Python的整数,因此其余值将解释为整数。
以下内容可修复您的代码并返回正确的答案,即[5]
:
import numpy as np
from scipy.interpolate import NearestNDInterpolator
points = np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0],[0, 1, 0],[.5, .5, 1]])
values = np.array([1, 2, 3, 4, 5])
interpolator = NearestNDInterpolator(points, values)
interpolator(np.array([[.5, .5, .8]]))
>>> array([5])
注意两件事:
numpy
,并使用了np.array
。这是使用scipy
的首选方法,因为np.array
尽管是静态的,但与python的list
相比要快得多,并且提供了一系列数学运算。interpolator
时,我使用的是[[...]]
而不是您的[...]
。为什么?它着重说明了NearestNDInterpolator
可以在多个点上插值的事实。