Я ищу метод, с помощью которого я могу сгладить разбросанный набор данных. Разбросанный набор данных получается из выборки очень большого массива, который представляет растр. Я должен векторизовать этот массив, чтобы уменьшить его. Я сделал это, используя функцию matplotlib.pyplot.contour()
, и получил разумный набор пар значений точек.
Проблема в том, что этот сигнал зашумлен, и мне нужно его сгладить. Сглаживание исходного массива бесполезно, мне нужно сгладить разбросанные данные. Лучшее, что я смог найти, - это приведенная ниже функция, которую я переписал с помощью аналога Matlab. Хотя эта функция выполняет свою работу, она работает очень медленно. Я ищу либо альтернативные функции для сглаживания этих данных, либо способ ускорить выполнение приведенной ниже функции.
def limgrad(self, triangulation, values, dfdx, imax=100):
"""
See https://github.com/dengwirda/mesh2d/blob/master/hjac-util/limgrad.m
for original source code.
"""
# triangulation is a matplotlib.tri.Triangulation instance
edge = triangulation.edges
dx = np.subtract(
triangulation.x[edge[:, 0]], triangulation.x[edge[:, 1]])
dy = np.subtract(
triangulation.y[edge[:, 0]], triangulation.y[edge[:, 1]])
elen = np.sqrt(dx**2+dy**2)
aset = np.zeros(values.shape)
ftol = np.min(values) * np.sqrt(np.finfo(float).eps)
for i in range(1, imax + 1):
aidx = np.where(aset == i-1)[0]
if len(aidx) == 0.:
break
active_idxs = np.argsort(values[aidx])
for active_idx in active_idxs:
adj_edges_idxs = np.where(
np.any(edge == active_idx, axis=1))[0]
adjacent_edges = edge[adj_edges_idxs]
for nod1, nod2 in adjacent_edges:
if values[nod1] > values[nod2]:
fun1 = values[nod2] + elen[active_idx] * dfdx
if values[nod1] > fun1+ftol:
values[nod1] = fun1
aset[nod1] = i
else:
fun2 = values[nod1] + elen[active_idx] * dfdx
if values[nod2] > fun2+ftol:
values[nod2] = fun2
aset[nod2] = i
return values