특정 위치의 데이터 읽기

게시판 IDL Q&A 특정 위치의 데이터 읽기

이 게시글은 5개 답변과 2명 참여가 있으며 마지막으로  Sangwoo에 의해 3 월, 1 주 전에 업데이트 됐습니다.

  • 글쓴이
  • #5352

    yelim
    회원

    n_time = 96
    westsea = dblarr(n_time) & westsea[*] = !values.d_nan

    time = dblarr(96) & time[*] = !values.d_nan
    time[0] = julday(3,23,2018,0,0,0)
    for i = 1, n_time-1 do time[i] = time[0]+i/24d
    e
    for i_time = 0, n_time-2 do begin
    widx = where(lon ge 119 and lon le 126 and lat ge 34 and lat le 40, n_widx)
    if n_widx gt 0 then begin
    westsea[i_time] = mean(aod[widx], /nan) ; 왜 다 똑같은거야

    endif
    endfor

    dumy = label_date(date_format=[‘%N/%D’])
    cgplot, time, westsea[*], /nodata, color = ‘blue’, $
    xtickformat = [‘LABEL_DATE’], xtickunits = [‘Days’], $
    xtitle=’Month/Day’, ytitle = ‘AOD at 550nm’, $
    yrange= [0,3], xstyle = 1, position = position

    안녕하세요. IDL 도움 얻고자 글 올립니다.
    다음과 같이 특정 위치에 대해서 시간별로 데이터를 평균하려고 합니다.
    hdf 파일로 데이터들을 읽어둔 상황이고요.
    그런데 완성된 그래프를 보면 축이랑 다 나타나는데 데이터값만 없습니다.
    westsea에 마우스 커서를 두어도 다 똑같은 값만 96개(n_time)가 있습니다.
    어떤 부분이 잘못된 걸까요..?

  • #5353

    yelim
    회원

    그래프에 데이터가 안그려지는 것은 /nodata를 없앴더니 해결되었어요!
    그런데 왜 시간마다 같은 값으로만 계산되는지 의문입니다 ㅠㅠ

  • #5354

    Sangwoo
    회원

    반복인자가 i_time인 반복문의 내용을 보면 WHERE를 사용하여 widx라는 인덱스를 얻고 이것으로 aod라는 배열의 값들을 인덱싱하고 있는데요. 아마도 aod라는 배열 내 값들 중에서 특정한 경도 및 위도 범위 내에 해당되는 값들을 추출한 후 이 값들에 대한 평균을 산출하는 작업인 것으로 보입니다. 그런데 WHERE의 내용을 보면 lon과 lat가 함께 들어가 있는데요. 그 라인 바로 밑에 PRINT, widx 명령을 추가해서 매 회차마다 widx가 어떤 값으로 출력되는지 확인을 해보시기 바랍니다. 제 짐작으로는 아마 계속 -1이 나올 것 같습니다. 실제로 그렇다면 그 이유는 WHERE 함수를 사용할 때 그 안에 투입되는 조건이 여러개라 하더라도 배열은 동일해야 합니다. 지금과 같이 lon과 lat가 섞여있으면 안될 것 같습니다. 물론 aod라는 배열이 1차원이냐 2차원이냐 여부에 따라 다를 수는 있는데요. 아마도 widx와 widy를 나눠서 추출해야 하는 방식으로 작업을 해야 할 것으로 보입니다.

    widx = where(lon ge 119 and lon le 126, n_widx)
    widy = where(lat ge 34 and lat le 40, n_widy)
    if n_widx gt 0 and n_widy gt 0 then begin
    westsea[i_time] = mean(aod[widx, widy], /nan)

    제가 aod라는 배열에 대한 정보를 알지못하기 때문에 더 자세한 답을 드리긴 힘들지만 일단 이런 방식을 사용해보시면 어떨까요? 그리고 결과가 이상하게 나올 경우에는 그 과정에 존재하는 변수나 배열의 값들을 직접 눈으로 확인하는 것이 코딩 작업에 있어서는 반드시 필요합니다. 원래 올리셨던 코드의 내용에서라면 widx와 aod[widx]의 값들을 실제로 출력해보는 것이 필요할 것이고, 제가 지금 올린 코드의 내용에서라면 widx, widy, aod[widx, widy]의 값들을 실제로 출력해보는 것이 필요할 수 있습니다.

  • #5355

    yelim
    회원

    자세한 답변 감사합니다!!

    widx를 print해볼 생각은 못했네요..!

    88081 88082 88083 88084 88085 88086 88087 88088

    해보니까 위와 같은 형식으로 프린트가 됩니다.

    다만 westsea 값이 시간에 따라 업데이트가 되지 않는 것이 문제입니다 ㅠㅠ

    time[0] = julday(3,23,2018,0,0,0) -> 이 부분에서 날짜를 바꿔도 값은 같게 나오더라고요.

    where문에 조건을 더 넣어보려는데 어렵네요.

    이 부분에 대해 조언을 구할 수 있을까요..?

  • #5356

    yelim
    회원

    widx = where(lon ge 119 and lon le 126 and lat ge 34 and lat le 40 and time ge time[0] and time le time[n_time-1] , n_widx)

    위처럼 기존 widx에 시간 개념도 포함했더니 widx가 -1이 나오네요..

    그래서 말씀해주신 것처럼

    for i_time = 0L, n_time-1 do begin
    widx = where(lon ge 119 and lon le 126 and lat ge 34 and lat le 40 , n_widx)
    widy = where(time ge time[0] and time le time[n_time-1], n_widy)
    if n_widx gt 0 and n_widy gt 0 then begin
    westsea_AOD[i_time] = mean(aod[widx,widy], /nan)
    endif

    이렇게 해봤는데

    % All array subscripts must be same size. Var = AOD

    이런 오류가 뜨는데 무슨 배열이 맞지 않다는 걸까요…?

  • #5357

    Sangwoo
    회원

    일단 WHERE문의 내용이 저렇게까지 복잡해지는 것은 절대로 바람직한 상황이 아닙니다. WHERE문 안에는 하나의 배열만 또는 서로 다른 배열이라 하더라도 서로 성격이 같은 것들만 사용되어야 합니다. 솔직히 제가 보기에는 lon, lat, time 등이 서로 어떤 관계인지에 대한 고려가 없이 그냥 막 투입된 것 같이 보입니다. 그리고 근본적으로 lon, lat, aod 등이 각각 어떤 구조를 갖는 배열인지 그리고 서로간의 관계가 어떠한지에 대한 정보를 전혀 주지 않으시면, 지금과 같은 방식으로 아무리 질문하셔도 누구도 정확한 답을 드리기는 힘들겁니다.

답변은 로그인 후 가능합니다.