NumPy: работает на многомерных массивах - PullRequest
2 голосов
/ 15 марта 2011

Извините за неопределенность названия.У меня есть два связанных вопроса.

Во-первых, допустим, у меня есть функция "гессиан", которая с учетом двух параметров (x, y) возвращает матрицу.Теперь я хочу вычислить эту матрицу для (x, y), работающей в двухмерном пространстве.Я хотел бы сделать что-то вроде:

x = linspace(1, 4, 100).reshape(-1,1)
y = linspace(1, 4, 100).reshape(1,-1)
H = vectorize(hessian)(x, y)

с результирующей H формы (100,100,2,2).Выше не работает (ValueError: установка элемента массива с последовательностью).Единственное, что я придумал, это

H = array([ hessian(xx, yy) for xx in x.flat for yy in y.flat ]).reshape(100,100,2,2)

есть ли лучший, более прямой путь?

Во-вторых, теперь H имеет форму (100,100,2,2) и dominant_eigenvector (X) делает именно то, что вы думаете.

U, V = hsplit(array(map(dominant_eigenvector, H.reshape(10000,2,2))), 2)

Мне снова нужно использовать понимание списка, чтобы выполнить итерацию и упаковать результат в массив, определяющий вручную форму.Есть ли более прямой способ достижения того же результата?

Спасибо!

edit: как предложили Paul и JoshAdel, я реализовал версию hessian, которая работает с массивами, вот она

def hessian(w1, w2):
    w1 = atleast_1d(w1)[...,newaxis,newaxis]
    w2 = atleast_1d(w2)[...,newaxis,newaxis]
    o1, o2 = ix_(*map(xrange, Z.shape))
    W = Z * pow(w1, o1) * pow(w2, o2)
    A = (W).sum()
    B = (W * o1).sum()
    C = (W * o2).sum()
    D = (W * o1 * o1).sum()
    E = (W * o1 * o2).sum()
    F = (W * o2 * o2).sum()
    return array([[ D/A - B/A*B/A, E/A - B/A*C/A ],
                  [ E/A - B/A*C/A, F/A - C/A*C/A ]])

Z можно считать глобальным массивом размером примерно 250x150.o1 и o2 индексируют два измерения Z для вычисления таких вещей, как $ \ sum_ {i, j} Z_ {ij} * i * j $.

Проблема этой версии в том, что промежуточные массивы слишком велики,Если w1 и w2 являются массивами, такими как w1_k, то w2_l W становится W_ {k, l, i, j}, для которого numpy дает ValueError: too big.

1 Ответ

0 голосов
/ 15 марта 2011

Вы можете попытаться использовать сетку, возможно, вам придется сгладить xn, yn:

x = linspace(1, 4, 100)
y = linspace(1, 4, 100)
xn,yn=meshgrid(x,y)
H = vectorize(hessian)(xn, yn)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...