LinearNDInterpolatorExtrapolate возвращает ошибку с тривиальным примером - PullRequest
1 голос
/ 28 мая 2019

Я пытаюсь использовать scipy's 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

Похоже, ошибка произошла из строки 81 scipy.interpolate.ndgriddata [ source ].К сожалению, я не смог продолжить погоню за ошибкой, так как не понимаю, что возвращает tree.query.

Это ошибка или я что-то не так делаю?

Ответы [ 3 ]

0 голосов
/ 28 мая 2019

Передайте ваш ввод в виде массивов

interpolator = NearestNDInterpolator(np.array(points),np.array(
values))

Вы можете даже передать много точек:

interpolator([np.array([.5,.5,.8]),np.array([1,1,2])])

>>>> array([5,5])
0 голосов
/ 28 мая 2019

В вашем случае это похоже на проблему с типом значения. Поскольку первые значения 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, хотя и статичен, намного быстрее по сравнению с list в Python и предоставляет спектр математических операций.
  • При звонке interpolator я использовал [[...]] вместо вашего [...]. Зачем? Это подчеркивает тот факт, что NearestNDInterpolator может интерполировать значения в нескольких точках.
0 голосов
/ 28 мая 2019

Просто передайте значения без списка в виде кортежа значений 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...