Устранить капли / спеклы в массиве 1d - PullRequest
0 голосов
/ 17 мая 2018

У меня есть 1D массив NumPy, содержащий некоторые «плохие» значения.Я хочу отбросить их.

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

Надежный тест для плохих значений состоит в том, чтобы спросить:

arr<0.1

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

Я использую следующую стратегию дляисключить плохие и вредные значения:

import numpy as np

c     = np.random.random(100) #Construct test data

who = np.where(c<0.1)[0]      #Reliable test for bad values
c[who] = 0                    #Zero bad values
#Add and subtract from the indices of the bad values to cull
#their neighbours
wht = who-1; wht = wht[np.logical_and(0<wht,wht<len(c))]; c[wht]=0
wht = who+1; wht = wht[np.logical_and(0<wht,wht<len(c))]; c[wht]=0
wht = who+2; wht = wht[np.logical_and(0<wht,wht<len(c))]; c[wht]=0
wht = who-2; wht = wht[np.logical_and(0<wht,wht<len(c))]; c[wht]=0

К сожалению, вышесказанное довольно медленно.

Есть ли более быстрый способ выполнить эту или аналогичную операцию?

1 Ответ

0 голосов
/ 17 мая 2018

Одним из масштабируемых решений для общей длины окна соседей будет binary-dilate маска сравнения порогов и затем использование этой маски для установки нулей -

from scipy.ndimage.morphology import binary_dilation

W = 2 # window length of neighbors
thresh = 0.1
mask = c < thresh
kernel = np.ones(2*W+1)
mask_extended = binary_dilation(mask, kernel)
c[mask_extended] = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...