크기 배열이 (50, 50)입니다. 이 어레이 안에는 크기 슬라이스 (20,10)가 있습니다. 이 슬라이스에만 데이터가 포함되고 나머지는 모두 nan으로 설정됩니다.Numpy 어레이는 NaN이 아닌 배열의 서브 세트/슬라이스를 가져옵니다.
어떻게하면 커다란 배열에서이 조각을 잘라낼 수 있습니까?
크기 배열이 (50, 50)입니다. 이 어레이 안에는 크기 슬라이스 (20,10)가 있습니다. 이 슬라이스에만 데이터가 포함되고 나머지는 모두 nan으로 설정됩니다.Numpy 어레이는 NaN이 아닌 배열의 서브 세트/슬라이스를 가져옵니다.
어떻게하면 커다란 배열에서이 조각을 잘라낼 수 있습니까?
NaN이 어디에 있는지 알고 계십니까? 그렇다면,이 같은 작업을해야합니다 : xstart
및 xend
는 시작과 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의 대답은 훨씬 낫다.
not NaN
을있는 아이템 수집이 사용 fancy 목록을 얻을 수 있습니다
:
a = a[ ~np.isnan(a) ]
+1, 내 것보다 훨씬 낫다. 멋진 색인 생성은 좋습니다. –
하지만 NaN이 아닌 영역의 모양을 미리 알고 있어야합니다. OP, 이걸 미리 아십니까? –
OP에 좋은 질문입니다. 질문 문안에 따르면 최종 모양이 알려진 것 같습니다. 그러나이 방법은 최소한 col 또는 행의 개수가 알려진 경우에 사용할 수 있습니다 ... –
NaN을 내가하지 않도록 변경됩니다 : 조 킹톤에 의해 제안 양자 택일
또는, 그들이 시작될 곳을 알고, 유한 영역이 연속적 일 것입니다. 나는 유한 한 것을 조각 내고 여전히 2D 모양을 유지하고 싶지만 numpy는 이렇게하지 않을 것입니다 : zz = obj.lat2d [np.isfinite (obj.lat2d)] zz.shape은 (33024,) – Shejo284
내 대답을 편집했습니다. 또는 sgpc의 대답을 참조하십시오. –