Извините за неопределенность названия.У меня есть два связанных вопроса.
Во-первых, допустим, у меня есть функция "гессиан", которая с учетом двух параметров (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
.