scipy griddata интерполяция возвращает вектор, заполненный нан - PullRequest
0 голосов
/ 12 июня 2018

У меня есть список точек в 3d, которые я хотел бы интерполировать на 3d-сетке.

coords = array([[  8.33399963,  12.94800186,  15.22500038],
       [  8.57299995,  13.90000153,  14.14700031],...)

У меня есть координаты сетки x, y, z, которые вместе с numpy.meshgridиспользуется для создания сетки:

xi,yi,zi = np.meshgrid(bbox[:,0],bbox[:,1],bbox[:,2])

, а затем, когда я пытаюсь выполнить интерполяцию:

griddata(coords,np.random.choice([.1,1,2],size=len(coords)),(xi,yi,zi),method='linear')

Я получаю вектор nans:

array([[[ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan],
        [ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan],
        [ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan],
        [ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan],
        [ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan],
        [ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan],
        [ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan],
        [ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan]],....

Что я тут не так делаю?

1 Ответ

0 голосов
/ 12 июня 2018

Я не знаю, что такое значения xi,yi,zi, но, скорее всего, они находятся за пределами домена, определенного coords.Если вы используете meshgrid для генерации сетки, обратите внимание на порядок массивов:

В трехмерном случае с входами длины M, N и P, выходы имеют форму (N, M, P) для индексации ‘xy’ и (M, N, P) для индексации ‘ij’.

Попробуйте:

In [61]: coords = 20 * np.random.random((200, 3)) - 1

In [62]: xi, yi, zi = np.meshgrid(np.arange(coords[:, 0].min()+2, coords[:,0].max()-2), np.arange(coords[:, 1].min()+2, coords[:,1
    ...: ].max()-2), np.arange(coords[:, 2].min()+2, coords[:,2].max()-2), indexing='ij')

In [63]: griddata(coords,np.random.choice([.1,1,2],size=len(coords)),(xi.astype(np.float), yi.astype(np.float), zi.astype(np.float
    ...: )),method='linear')

Вы все равно получите некоторыеnan значения, в которых точки плохо отбирают функцию, но большинство значений определены.

Другая возможность состоит в том, что вы просто видите первый «план», который может содержать в основном nan.Попробуйте np.sum(np.isfinite(g)), чтобы увидеть, как точки могут быть действительными из всех точек np.prod(g.shape), где g - это результат вывода griddata().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...