Быстрое сглаживание разбросанных данных - PullRequest
0 голосов
/ 20 октября 2019

Я ищу метод, с помощью которого я могу сгладить разбросанный набор данных. Разбросанный набор данных получается из выборки очень большого массива, который представляет растр. Я должен векторизовать этот массив, чтобы уменьшить его. Я сделал это, используя функцию 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
...