LinearNDInterpolatorExtrapolate使用简单的示例返回错误

时间:2019-05-28 16:55:57

标签: python scipy

我正在尝试使用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,我无法进一步追查该错误。

这是一个错误还是我做错了什么?

3 个答案:

答案 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)

在您的情况下,值类型似乎有问题。由于pointsvalues的第一个值是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可以在多个点上插值的事实。