2017-01-09 14 views
1

Функция scipy.interpolate.griddata позволяет указать ключевое слово fill_value, для которых ДоПа состояние:Использования fill_value внешних границ с scipy.interpolate.griddata и методом = ближайший

значение, используемое для заполнения для запрашиваемых точек за пределами выпуклого корпус входные точки. Если не указано, то по умолчанию используется нан. Этот параметр не влияет на метод «ближайшего».

Однако, мне нужно указать fill_value использовать вне границ при использовании method='nearest' с 2D данных. Как это можно достичь?

ответ

3

Это может быть сравнительно легко достигается с помощью следующей обходным:

  1. бег с method='nearest'
  2. запустить снова method='linear'; здесь внешняя область заполнена np.nan.
  3. везде, где есть NaN в результате 2. Назначьте желаемый fill_value к результату 1.

Код:

import numpy as np 
from scipy.interpolate import griddata 

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:100j, 0:1:200j] 

points = np.random.rand(100, 2) 
values = func(points[:,0], points[:,1]) 

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

fill_value = 123 # Whatever you like 
grid_z0[np.isnan(grid_z1)] = fill_value 

Менее специальный подход был бы вычислить выпуклую оболочку явно и использовать ее для присвоения значения заливки. Это потребует больших усилий, но может работать быстрее.

+0

Спасибо за ваш ответ, это действительно простое решение! Хотя на практике он будет использовать в два раза больше времени, требуемого с помощью одного метода 'method = 'ближайшее'. Я посмотрю на ['scipy.spatial.ConvexHull'] (https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.ConvexHull.html), это может сделать трюк. –

+0

здесь проблема, где это отслеживается: https://github.com/scipy/scipy/issues/5176 – denfromufa