2013-06-15 2 views

답변

1

NaN이 어디에 있는지 알고 계십니까? 그렇다면,이 같은 작업을해야합니다 : xstartxend는 시작과 X 치수에서 원하는 조각의 끝과 유사하게 y를위한

newarray = np.copy(oldarray[xstart:xend,ystart:yend]) 

. 더 이상 필요하지 않은 경우 이전 배열을 삭제하여 메모리를 비울 수 있습니다.

NaN이가 어디 있는지 모르는 경우,이 트릭을 수행해야합니다 np.where 모든 일을보기 때문에이 큰 배열을 위해 매우 느릴 것이라고

# in this example, the starting array is A, numpy is imported as np 
boolA = np.isnan(A) #get a boolean array of where the nans are 
nonnanidxs = zip(*np.where(boolA == False)) #all the indices which are non NaN 
#slice out the nans 
corner1 = nonnanidxs[0] 
corner2 = nonnanidxs[-1] 
xdist = corner2[0] - corner1[0] + 1 
ydist = corner2[1] - corner1[1] + 1 
B = copy(A[corner1[0]:corner1[0]+xdist,corner1[1]:corner1[1]+ydist]) 
#B is now the array you want 

참고. 숫자 버그 추적기에는 일부 값과 동일한 첫 번째 색인을 찾은 다음 중지하는 메소드에 대한 열린 문제가 있습니다. 이것을하는 더 우아한 방법이 있을지도 모른다 이것은 나의 머리에 단지 왔던 물건이다.

편집 : 무시, sgpc의 대답은 훨씬 낫다.

+0

NaN을 내가하지 않도록 변경됩니다 : 조 킹톤에 의해 제안 양자 택일

a = a[ np.logical_not(np.isnan(a)) ].reshape(20,10) 

또는, 그들이 시작될 곳을 알고, 유한 영역이 연속적 일 것입니다. 나는 유한 한 것을 조각 내고 여전히 2D 모양을 유지하고 싶지만 numpy는 이렇게하지 않을 것입니다 : zz = obj.lat2d [np.isfinite (obj.lat2d)] zz.shape은 (33024,) – Shejo284

+0

내 대답을 편집했습니다. 또는 sgpc의 대답을 참조하십시오. –

3
당신은 not NaN을있는 아이템 수집이 사용 fancy 목록을 얻을 수 있습니다

:

a = a[ ~np.isnan(a) ] 
+0

+1, 내 것보다 훨씬 낫다. 멋진 색인 생성은 좋습니다. –

+2

하지만 NaN이 아닌 영역의 모양을 미리 알고 있어야합니다. OP, 이걸 미리 아십니까? –

+0

OP에 좋은 질문입니다. 질문 문안에 따르면 최종 모양이 알려진 것 같습니다. 그러나이 방법은 최소한 col 또는 행의 개수가 알려진 경우에 사용할 수 있습니다 ... –

관련 문제