Python MemoryError в функции радиального базиса Scipy (scipy.interpolate.rbf)

Я пытаюсь интерполировать не -так -большое (~10 000 выборок )облако точек, представляющее 2D-поверхность, используя Scipy Radial Basis Function (Rbf ). У меня есть хорошие результаты, но с моими последними наборами данных я постоянно получаю MemoryError, хотя ошибка появляется почти мгновенно во время выполнения (, ОЗУ явно не съедается ).

Я решил взломать копию файла rbf.pyиз Scipy, начав с заполнения его некоторыми операторами печати, которые оказались очень полезными. Разлагая метод _euclidean_normпострочно, вот так:

def _euclidean_norm(self, x1, x2):
    d = x1 - x2
    s = d**2
    su = s.sum(axis=0)
    sq = sqrt(su)
    return sq

Я получаю ошибку в первой строке:

File "C:\MyRBF.py", line 68, in _euclidean_norm
    d = x1 - x2
MemoryError

Эта норма вызывается для массива X1 в виде [[x1, y1], [x2, y2], [x3, y3],..., [xn, yn]] и X2, который представляет собой X1, транспонированный следующий метод внутри класса Rbf, уже взломанный мной с целью отладки:

def _call_norm(self, x1, x2):
    print x1.shape
    print x2.shape
    print

    if len(x1.shape) == 1:
        x1 = x1[newaxis, :]
    if len(x2.shape) == 1:
        x2 = x2[newaxis, :]
    x1 = x1[..., :, newaxis]
    x2 = x2[..., newaxis, :]

    print x1.shape
    print x2.shape
    print

    return self._euclidean_norm(x1, x2)

Обратите внимание, что я печатаю формы входных данных. Вот что я получаю с моим текущим набором данных (Я добавил комментарии вручную):

(2, 10744)         ## Input array of 10744 x,y pairs
(2, 10744)         ## The same array, which is to be "reshaped/transposed"

(2, 10744, 1)      ## The first "reshaped/transposed" form of the array
(2, 1, 10744)      ## The second "reshaped/transposed" form of the array

Обоснование, согласно документации, состоит в том, чтобы получить «матрицу расстояний от каждой точки в x1 до каждой точки в x2», что означает, поскольку массивы одинаковы, матрица расстояний между каждой парой входного массива (, который содержит размеры X и Y ).

Я проверил операцию вручную с гораздо меньшими массивами (формы (2,5,1 )и (2,1,5 ), например ), и вычитание работает.

Как я могу узнать, почему он не работает с моим набором данных? Есть ли другая очевидная ошибка? Должен ли я проверить некоторую форму неправильной -обработки моего набора данных или выполнить некоторую предварительную -его обработку?Я думаю, что она хорошо -обусловлена, так как я могу изобразить ее в 3D, а точка облака визуально очень хорошо сформирована.

Любая помощь будет очень высоко ценится.

Спасибо за чтение.

7
задан heltonbiker 8 August 2012 в 13:15
поделиться