2017-11-09 11 views
1

나는 달성하기가 어렵다는 것을 "단순한"목표로 염두에두고 있습니다. 세 개의 2 차원 배열 lat, londata이 모두 크기 (24576, 24576)입니다. 처음 두 가지는 위도와 경도 좌표 인 data입니다.이 변수는지도 위에 음모를 꾸미려고합니다. 전 바이너리 파일과 텍스트 파일의 조합에서 이러한 모든 데이터를 읽으므로 사전 처리 작업이 실제로 불가능하며 파이썬 스크립트에서 수행해야합니다.파이썬 (IMS snowcover)의 큰 데이터 세트에서 2 차원 위도, 경도 및 데이터 서브 세트

배열의 차원을 감안할 때 메모리 제한으로 인해 전 세계의 작은 영역에서베이스 맵 프로젝션을 선택할 때도 데이터를 직접 그릴 수는 없습니다. 나는 이미 그것을 시도하고 basemap.contourf로 음모를 꾸미려고 할 때 메모리 오류가 발생했습니다.

따라서 배열을 등고선 함수로 전달하기 전에 배열을 부분 집합 화해야합니다. 나는 많은 것들을 시도했지만 아무것도 작동하지 않는 것 같습니다. latslons는 2-D 좌표 배열이 어디 내 생각이

lat_bnds, lon_bnds = [35, 50], [5, 20] 
condition=((lats > lat_bnds[0]) & (lats < lat_bnds[1])) & (lons > lon_bnds[0]) & (lons < lon_bnds[1]) 

처럼 뭔가를했다. 그러면 원래의 데이터를 가면 처리 할 수 ​​있지만 서브 세트는 사용할 수없는 lats (또는 이와 동등한 lons)과 동일한 차원을 갖는 2 차원 부울 배열이 생성됩니다.

numpy.where에서 동일한 조건을 사용하면 사용할 수없는 배열 모양 (2, 2564856)가 생성됩니다. 여기서 문제는 2D 배열의 모든 지점에서 만족되어야하는 여러 조건이 있으며 연속 된 사각형 부분 행렬로 이어질 것이라는 보장이 없다는 것입니다. 그러나 그 데이터를 플롯하기 위해 나는 그것들을 부분 집합 화하거나 그것들을 정교화 할 다른 방법을 찾아야한다.

나는 분명한 뭔가를 놓치고 있습니까? 오류가 발생하지 않고 원본 데이터를 플롯 할 수있는 다른 스마트 방법이 있습니까? 당신이 필요한 파일을 다운로드 한 가정의 데이터를 읽을 수http://nsidc.org/data/G02156

간단한 스크립트 : 데이터의

소스

import numpy as np 
import pandas as pd 
from mpl_toolkits.basemap import Basemap # Import the Basemap toolkit 

with open('IMS1kmLats.24576x24576x1.double', 'rb') as f: 
data = np.fromfile(f, dtype='<d', count=24576*24576) 
lats = np.reshape(data, [24576, 24576], order='F') 

with open('IMS1kmLons.24576x24576x1.double', 'rb') as f: 
data = np.fromfile(f, dtype='<d', count=24576*24576) 
lons = np.reshape(data, [24576, 24576], order='F') 

widths=np.full((24576), 1, dtype=int).tolist() 
data=np.array(pd.read_fwf('ims2017312_1km_v1.3.asc', skiprows=30, 
widths=widths, lineterminator='\n', header=None)) 

답변

0

난 당신의 배열을 얻었는지 확실하지 않다 원래 배열의 하위 집합을 원하고 조건이있는 경우 원본 목록에서 슬라이스 할 수 있다고 생각하십시오.

a = np.random.randint(10,50, size=(50,2)) # ---- generate coordinates 

array([[44, 11], 
     [40, 36], 
     [19, 26], 
     ..., 
     [33, 26], 
     [42, 12], 
     [15, 25]]) 

lats = a[:, 1] # ---- latitude is Y-axis 
lons = a[:, 0] # ---- longitude is X-axis 
lat_bnds, lon_bnds = [35, 50], [5, 20] # ---- your desired bounds 

condition =((lats > lat_bnds[0]) & (lats < lat_bnds[1])) & 
      (lons > lon_bnds[0]) & (lons < lon_bnds[1]) 

condition 
array([False, False, False, ..., False, False, False], dtype=bool) 

condition.shape # => (50,) 

a[condition]  # ---- slice the original array 

array([[11, 45], 
     [15, 40], 
     [15, 43], 
     [15, 49]]) 

희망하는 방향으로 이동하는 희망.

+0

안녕하세요. 질문에 답해 주셔서 감사합니다.하지만 불행히도 도움이되지 않습니다. 위도와 경도는 원래의 극좌표 입체 투영법에서 2-d 배열이므로, 단순히 조각을 긋는 것이 좋지는 않습니다. 조건이 맞는 모든 격자 점을 검사해야하며, 문제를 재현하는 데 도움이 될 수있는 게시물에 몇 가지 추가 정보를 추가했습니다. –

+0

예 샘플 데이터가 유용했을 것입니다. 포인트가 스 토로 그래픽 프로젝션에 투영되면 경계를보고 할 수 있습니다 동일한 투영법에서 상자 좌표 – NaN

0

파이썬으로 IMS 1km 해상도 데이터를 플로팅하려 할 때이 게시물을 읽는 사람이 있으면 제대로 작동 할 수있는 가난한 사람의 해결책이 있습니다.

메모리 오류는 플롯 루틴에 의해 발생하지만 배열은 여전히 ​​파이썬에 저장할 수 있습니다. 그래서, 대신 어디 기능을 사용하여 부분 집합의, 난 그냥 같은

lat_subset=lat[imin:imax, jmin:jmax] 

을 명시 적 인덱싱을 사용하려하고 있습니다하기 위해지도 투영을 윤곽 플롯을 수행하거나 사용하지 않고 plot.imshow()로 결과를 플로팅 데이터가 어떻게 보이는지에 대한 아이디어. 이것은 내 관심 영역이 안에있는 방식으로 인덱스 범위를 선택할 수있게 해 줬습니다.이제는 메모리 오류없이 윤곽 플롯을 만들 수있었습니다.

저는 데이터를 플로팅하는 방법을 보여주는 노트북이있는 작은 저장소가 있습니다 : https://github.com/guidocioni/snow_ims/blob/mistral/plot_ims.ipynb. 좌표 파일은 크기를 고려하여 다운로드해야하지만 온라인으로 파일을 직접 읽을 수있는 장점이 있습니다.