Scikit-image: Как я могу игнорировать / маскировать нулевые значения из ndarray для последующей интерполяции? - PullRequest
0 голосов
/ 19 декабря 2018

Как вы можете видеть мой вопрос выше, я хотел бы замаскировать / игнорировать нулевые значения от ndarray, который я хотел бы интерполировать позже.Я надеюсь, что вы можете помочь мне с этим, потому что я уже много дней пытаюсь решить эту проблему.

Что я хочу?

У меня много ndarrays с разнымиразмеры длины, которые я хотел бы интерполировать, скажем, в этом случае, чтобы сделать его меньше.

Вот как выглядит один из этих массивов:

[0.0, 0.0, 0.0, 0.0, 0.0, 144.0, 144.0, 145.0, 145.0, 144.0, 143.0, 143.0, 0.0, 0.0, 0.0]

Как видите, это всегда одна строка (назовем ее "array_row") со многими элементами (для этого примера я только что написал пример массива с 15 элементами)

Как мнеинтерполировать?

Я использую метод изменения размера изображения scikit, например:

new_array = skimage.transform.resize(array_row, (1, 10))

Результат этой интерполяции выглядит примерно так:

[0.0, 0.0, 71.49999999, 144.0, 144.60344827, 145.0, 144.70896278, 143.0, 71.49999999, 0.0, 0.0]

При использовании интерполяции этот результат выглядит примерно так.Значение «71.49999999» связано с нулевым значением до и / или после ненулевых значений, что является нормальным.

Но для моего случая я не хочу, чтобы это происходило.Я хотел бы позволить skimage.transform.resize игнорировать нулевые значения, чтобы результат был примерно таким:

[0.0, 0.0, 144.0, 144.0, 144.60344827, 145.0, 144.70896278, 143.0, 143.0, 0.0, 0.0]

Значения не должны изменяться (или, по крайней мере, только из ненулевого значениярядом с ним).

На самом деле я понятия не имею, как это сделать.Я пробовал что-то вроде маскировки и присвоения замаскированным индексам значения «255», что также не дает ожидаемого результата.

Есть ли у вас какие-либо идеи о том, как достичь этой цели?

1 Ответ

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

Функции scikit-image ожидают равномерно распределенную сетку значений, но в scipy есть и другие интерполяторы, которые предоставляют больше свободы.Например, рассмотрим кубический интерполятор, который принимает входные координаты и значения в качестве входных данных:

import numpy as np
from scipy import interpolate

import matplotlib.pyplot as plt


y = np.array([150, 0.0, 0.0, 0.0, 0.0, 144.0, 144.0, 145.0, 145.0, 144.0, 143.0, 143.0, 0.0, 0.0, 148])
x = np.arange(len(y))
x_ = np.linspace(0, 14, 100)
mask = (y != 0)

p = interpolate.interp1d(x, y, kind='cubic')
p_masked = interpolate.interp1d(x[mask], y[mask], kind='cubic')

plt.plot(x, y, 'x-', label='Input')
plt.plot(x_, p(x_), label='Interpolated')
plt.plot(x_, p_masked(x_), label='Interpolated (ignoring zeros)')
plt.legend()
plt.savefig('/tmp/cubic_interpolation.png', dpi=300)
plt.show()

cubic interpolation with and without masking

Для этого подхода вам необходимо указатьконечные точки, потому что это не экстраполирует.Радиальные базисные функции будут лучше работать для экстраполяции, но также будут иметь тенденцию к снижению до нуля в регионах без данных.

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