번역

2014-07-12 3 views
1

Grid.aGridlinspace(aMin, aMax, nA)을 이용하여 생성된다 번역

A1, M1, A2, M2, A3, M3, E = meshgrid(Grid.aGrid, Grid.mGrid, Grid.aGrid, Grid.mGrid, Grid.aGrid, Grid.mGrid, Grid.eGrid, indexing='ij') 

를 이용하여 생성 (A1, M1, A2, M2, A3, M3, E) 형상의 격자를 가지며, 마찬가지로 다른 그리드.

일부 Z = f(A1, ...)을 고려하십시오. 여기에서 f()은 일부 그리드 포인트를 부적절한 것으로 표시합니다. 단순화를 위해,하자.

Z = A1 + A2 + A3 
Z[Z < 0] = NaN 

Z[0, 1, 2, 3, 4, 5, 6]을 고려하십시오. 실제 값 (aGrid[0], mGrid[1], aGrid[2], mGrid[3], aGrid[4], mGrid[5], eGrid[6])에 해당하는 값을 포함합니다. 이것은 내가 f()으로 표시되지 않은 Z의 모든 점에 대해 달성하려고 정확히 : 등 z1이 종류의 모든 곳

내가 사전

foo = {z1, z2, z3, ... zn} 

를 만들

z1 = (aGrid[0], mGrid[1], aGrid[2], mGrid[3], aGrid[4], mGrid[5], eGrid[6]) 

이고, z1의 위치에 해당하는 격자 값은 Z입니다.

는 내가 뭔가를 내놓았다 :

aGrid = arange(0, 10) 
mGrid = arange(100, 110) 
eGrid = arange(1000, 1200) 

A,M,E = meshgrid(aGrid, mGrid, eGrid, indexing='ij') 

# contains the grid index 
Z = (A + M + E).astype(float) 
Z[A < 3] = nan 
# will contain the actual values, as tuples 
Z2 = {} 

for i, idx in enumerate(ndindex(Z.shape)): 
    a = aGrid[idx[0]] 
    m = mGrid[idx[1]] 
    e = eGrid[idx[2]] 

    if isnan(Z[idx]): 
     Z2[i] = NaN 
    else: 
     Z2[i] = (a, m, e) 

효율성이 중요합니다. 이것을 달성 할 수있는 더 빠르고/깨끗한 방법이 있습니까? 사전을 사용하는 대안?

나는 특히 aGrid[idx[0]] 등을 적어 두지 않는 것이 싫어. 알고리즘을 좀 더 일반적으로 유지할 수 있습니까? 사용 broadcast_arrays()

for i, idx in enumerate(ndindex(Z.shape)): 
    # some magic happens here. What exactly? 
    someMagicList = magic(aGrid, mGrid, eGrid) 
    Z2[i] = someMagicList[idx] 

답변

1

의 선, 그 결과 Z2에 따라 어떤 것은 모양 (20000, 3)와 배열입니다.

import numpy as np 

aGrid = np.arange(0, 10, dtype=float) 
mGrid = np.arange(100, 110, dtype=float) 
eGrid = np.arange(1000, 1200, dtype=float) 

A,M,E = np.meshgrid(aGrid, mGrid, eGrid, indexing='ij') 

# contains the grid index 
Z = (A + M + E).astype(float) 
Z[A < 3] = np.nan 

grids = [A, M, E] 
grid_bc = np.broadcast_arrays(*grids) 
Z2 = np.column_stack([g.ravel() for g in grid_bc]) 
Z2[np.isnan(Z.ravel())] = np.nan 

print Z2[5900], Z2[6000] 
+0

이것은 내가하는 일보다 효율성이 크게 향상 된 것처럼 보입니다. 나는 이것을 대본에 넣으려고 노력하고있다. (나는 새로운 질문을하기에는 너무 짧다) :'NaN '이 아닌 사람들의 부분 집합을 어떻게 얻을 수 있습니까? 'statesRelevant = [np.isnan (z.any())]'가 아니라면 states에있는 z는 z를 모두 가지고 있습니다. 분명히 isnan()은'(nan, ..)을 가진 사람들을 선택하지 못했습니다. .)'그들. – FooBar

+0

나는 당신의 질문을 이해하지 못합니다,'국가'는 무엇입니까? 'Z [~ np.isnan (Z)]'또는'Z2 [~ np.isnan (Z)]를 의미합니까? – HYRY

+0

죄송합니다, 나는'Z2'을 (를) 의미합니다. isnan()의 지시자로'Z'를 사용하는 것은 좋지만,'Z2' 만 남긴다면 어떨까요? 나는 그것을 처리하는 함수를 통해서만'Z2'를 전달할 계획입니다. – FooBar