NaN в конце массива закрадываются при использовании interp1d - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть 2 2D массива позиций x и y, которые выражают значения контурного графика.Поскольку я перевожу контурный график несколько раз, мне нужно отслеживать исходные координаты по мере их перемещения, чтобы я мог выразить окончательное смещение во всех точках исходного изображения.

Я пишу на python3, используя scipy.interpolate.interp1d.После одной итерации у меня нет проблем, и координаты были успешно интерполированы обратно в исходную сетку.Я распечатываю последние 10 элементов одного из столбцов в массиве 2D:

import numpy as np
from scipy.interpolate import interp1d
print(y_coordinate[-10:, 20])
>>> [ 60.  61.  62.  63.  64.  nan  nan  nan  nan  nan]

У меня есть nans, потому что смещение было равно -5 в направлении y изображения шириной 64 пикселя, поэтому 5 пикселейвверху сместились вниз.Проблема в том, что на следующем шаге у меня нулевое смещение в направлении y, поэтому точки здесь не перемещаются, но они могут перемещаться в другое место в моем большом массиве, поэтому необходимо выполнить интерполяцию по всему массиву.

Я интерполирую столбец за столбцом, используя scipy.interpolate.interp1d следующим образом (и для ясности удаляю индексы массива, но знаю, что они такие же, как в предыдущих строках выше):

f = interp1d(y, y_coordinate, kind='linear', bounds_error = False)
new_y_coordinate = f(y)

где y_coordinate - этокак указано выше, y равно

>>>[55,56,57,58,59,60,61,62,63,64]

По сути, я хочу, чтобы он возвращал точно такие же значения, как они уже лежат в точках, на которые я хочу его интерполировать.Вместо этого я получаю это:

print(new_y_coordinate)
>>> [ 60.  61.  62.  63.  nan  nan  nan  nan  nan  nan]

У меня есть нано, вползающая в хорошие данные.Что странно, во-первых, я попробовал это с комплексными числами и подумал, что это было ошибкой.Затем я изменил его на два массива действительных чисел и обнаружил, что ошибка была решена в левой части массива (для преобразований в направлении х), но теперь она возникает сверху для преобразований смещения у.В простом тесте, который я проводил с похожей ситуацией, этой ошибки вообще не было.

Есть идеи о том, что происходит и как я могу ее решить?

1 Ответ

0 голосов
/ 12 декабря 2018

Вы должны передать fill_value='extrapolate' в interp1d.На всякий случай вы также можете фильтровать nan значения с помощью маски.Код:

# assuming they are not np.arrays to begin with
y_coordinate = np.asarray(y_coordinate)   
y = np.asarray(y)

mask = ~np.isnan(y)
f = interp1d(y[mask], y_coordinate[mask], kind='linear', bounds_error=False, fill_value='extrapolate')
...