Сетка Scipy интерполяция не работает (дает нан) - PullRequest
4 голосов
/ 11 марта 2012

Я пробовал 2-й пример, приведенный в справочном файле scipy.interpolation.griddata.Он работает для интерполяции с «ближайшим».Но он дает матрицу, заполненную nan, используя любую другую интерполяцию, например, «линейную» или «кубическую».Если я задаю аргумент fill_value = 5, он дает матрицу, заполненную 5.

Это связано с какой-то проблемой установки?

Я пробовал то же самое, что они дали в справочном документе.Но так или иначе это дает результат, как будто точки, которые я просил интерполировать, лежат вне входных точек.(это не так! Я последовал примеру)

Я опубликую пример, чтобы воспроизвести ошибку (в виде документа)

def func(x, y):
    return x*(1-x)*np.cos(4*np.pi*x) * np.sin(4*np.pi*y**2)**2

grid_x, grid_y = np.mgrid[0:1:10j, 0:1:10j]
points = np.random.rand(100, 2)
values = func(points[:,0], points[:,1])

from scipy.interpolate import griddata

grid_z0 = griddata(points, values, (grid_x, grid_y), method='nearest')
grid_z1 = griddata(points, values, (grid_x, grid_y), method='linear')
grid_z2 = griddata(points, values, (grid_x, grid_y), method='cubic')

Я получаю grid_z1 и grid_z2 как матрицузаполнено nan.

ОБНОВЛЕНИЕ : Я установил все пакеты на другой машине Ubuntu 11.10.И тот же сценарий дал совершенно правильный ответ.Ранее я примерял дистрибутив Porteus (живая семья Slackware).Следовательно, я думаю, что я могу с уверенностью заключить, что это была некоторая проблема в моей установке.У кого-нибудь есть идеи, что могло пойти не так?Любой конфликт библиотеки приводит к такому поведению?Так как моей основной машиной является Portues, у меня нет другого выбора, кроме как отремонтировать scipy в нем.

Ответы [ 3 ]

7 голосов
/ 12 марта 2012

Вы говорите «заполнен наном», но на самом деле он не заполнен. Используя ваш код, но добавив

np.random.seed(7)

в начале, так что мы работаем с одним и тем же набором данных, я нахожу

>>> np.isnan(grid_z1).sum()
744
>>> np.isnan(grid_z2).sum()
744

И эти NaN встречаются на внешней полосе:

>>> np.isnan(grid_z1[5:-5,5:-5]).sum()
0

, что делает вероятным, в чем проблема. Точки, которые дают NaN, находятся за пределами указанных точек, поэтому он не знает, что с ними делать. Для особого случая «ближайшей» интерполяции вы все равно можете найти что-то, что рядом, так что вы не получите никаких NaN.

Так что, когда вы говорите, что точки, на которые нужно интерполировать, не лежат вне входных точек, я позволю себе отличаться:

# brute force, because I'm too lazy
from collections import Counter
d = Counter()
for x, y, val in zip(grid_x.flat, grid_y.flat, grid_z1.flat):
    pg = (points >= [x, y])
    boxed = len(set(tuple(p) for p in pg)) == 4
    d[np.isnan(val), boxed] += 1

производит

>>> d
Counter({(False, True): 19189, (True, False): 744, (False, False): 67})

И нет (Правда, Правда) случаев. Таким образом, каждому NaN не хватает ограничительной рамки в точках. В некоторых случаях (Ложь, Ложь) значение не имеет ограничивающего прямоугольника, но не приводит к появлению NaN, что немного удивительно, но если они предположили, что все содержится, это, вероятно, будет зависеть от скучного детали реализации, что происходит, если они не. Короткая версия: я думаю, что все здесь, вероятно, работает правильно, в смысле, как и ожидалось.

1 голос
/ 12 марта 2012

Непонятно, как вы установили scipy (или какую версию вы используете - попробуйте $ python -c "import scipy; print scipy.__version__", чтобы узнать), но поскольку griddata опирается на скомпилированный код, возможно, что то, что вы видите, является результатомпроблема сборки или (менее вероятно) ошибка griddata, специфичная для вашей платформы.

Я предлагаю сообщить об этом в scipy-user списке рассылки http://mail.scipy.org/mailman/listinfo/scipy-user,, который больше подходит для решения проблем сборки и установки, чем StackПереполнение.

Перед публикацией в списке рассылки стоит установить nose инфраструктуру тестирования http://packages.python.org/nose,, чтобы вы могли запустить

$ python -c "import scipy; scipy.test()"

и сообщить подробностилюбые неудачные тесты одновременно.

0 голосов
/ 20 августа 2012

У меня та же проблема, но я думаю, что она была исправлена ​​в scipy 0.11rc2 (не то, что я смог установить ее поверх моего дистрибутива Enthought Python, чтобы узнать ...)?

...