2011-03-15 5 views
2

제목의 모호함에 대해 사과드립니다. 두 가지 관련 질문이 있습니다.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}가됩니다.

+3

이유'hessian' 배열을 받아 수정할 수 없습니다가 있습니까? – Paul

+0

uhm,'hessian'은 이미 세 개의 색인을 가진 어떤 것에 계산을합니다. 예, 원칙적으로 생각하는 배열을 받아들이 기 위해 다시 쓸 수 있습니다. 큰 두통이 있습니다. – andreabedini

+0

'hessian '이 무슨 일을하고 있는지 게시하면, 우리에게 재 작성을 도와 줄 수있는 사람이 몇 명 있습니다. 그것은 배열을 직접 취하고 작업하는 간결한 방법입니다. – JoshAdel

답변

0

당신은 meshgrid를 사용하려고 할 수있다, 어쩌면 당신은 XN, YN을 평평하게해야한다 :

x = linspace(1, 4, 100) 
y = linspace(1, 4, 100) 
xn,yn=meshgrid(x,y) 
H = vectorize(hessian)(xn, yn) 
+0

문제는 반환 유형에 있으며, hessian은 2x2 행렬을 반환합니다. "ValueError : 시퀀스가있는 배열 요소를 설정합니다." – andreabedini

관련 문제