제목의 모호함에 대해 사과드립니다. 두 가지 관련 질문이 있습니다.numpy : 다차원 배열에서 작동
먼저 두 매개 변수 (x, y)가 매트릭스를 반환하는 "hessian"함수가 있다고 가정 해 보겠습니다. 이제는 (x, y)에 대한 행렬을 2 차원 공간에서 계산하려고합니다. 나는 다음과 같은 것을하고 싶다.
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)
나는 다시 반복을 수행하는 지능형리스트를 사용하여 수동으로 모양을 지정하는 배열의 결과를 재 포장 할 필요가있다. 같은 결과를 얻는 더 직접적인 방법이 있습니까?
감사합니다.
편집 : 바울과 JoshAdel에 의해 제안, 내가 배열 작동 헤센의 버전을 구현, 여기 대략 250x150의 전역 배열로 간주 될 수
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입니다. o1 및 o2는 $ \ sum_ {i, j} Z_ {ij} * i * j $와 같은 것을 계산하기 위해 Z의 두 차원을 계산합니다.
이 버전의 문제점은 중간 배열 이 너무 크다는 것입니다. w1과 w2가 w1_k와 같은 배열 인 경우 w2_l W는 numpy가 ValueError: too big
인 W_ {k, l, i, j}가됩니다.
이유'hessian' 배열을 받아 수정할 수 없습니다가 있습니까? – Paul
uhm,'hessian'은 이미 세 개의 색인을 가진 어떤 것에 계산을합니다. 예, 원칙적으로 생각하는 배열을 받아들이 기 위해 다시 쓸 수 있습니다. 큰 두통이 있습니다. – andreabedini
'hessian '이 무슨 일을하고 있는지 게시하면, 우리에게 재 작성을 도와 줄 수있는 사람이 몇 명 있습니다. 그것은 배열을 직접 취하고 작업하는 간결한 방법입니다. – JoshAdel