Как преобразовать в массивы длины 1?

Я открыл файл netCDF с двумя переменными. Каждая переменная имеет 4 измерения: время, высота, широта и долгота.

Я использую скрипт, который зацикливается на каждом шаге широты (i) и долготы (j) и доставляет данные в формат с плавающей запятой и записывается в мой выходной файл, хотя я получаю эту ошибку:

utemp = float(uwind[i][i][j])  # data 
TypeError: only length-1 arrays can be converted to Python scalars

Здесь я даю вам кодировку, которую я использую.

Прочитайте длину:

tstep = range(len(time))
lonstep = range(len(lon))
latstep = range(len(lat))

Установить переменные:

time = ncfile.variables['time']
lat = ncfile.variables['lat']
lon = ncfile.variables['lon'] 
uwind = ncfile.variables['10u']  

Запишите в файл:

for t in tstep:
  for i in latstep:      
    for j in lonstep:      
      utemp = float(uwind[t][i][j])  
      windfile.write('%.4f '%utemp)  

Может ли кто-нибудь помочь мне преобразовать переменную в правильный формат, не получая ошибки?

Это изменение, которое я сделал, и оно, кажется, записывается в файл непосредственно перед остановкой:

    for t in tstep:     

   windfile.write(header+'\n')    
   for hts in htstep:
      for i in latstep:     
         for j in lonstep:     
            utemp = float(uwind[hts][t][i][j])  # data 
            windfile.write('%.4f '%utemp)  
         windfile.write('\n')
   for hts in htstep:
      for i in latstep:
         for j in lonstep:
            vtemp = float(vwind[hts][t][i][j])
            windfile.write('%.4f '%vtemp)
         windfile.write('\n')
windfile.close() 

От этого я получаю

Traceback (most recent call last):
  File "CFSR2SWAN.py", line 52, in <module>
    utemp = float(uwind[hts][t][i][j])  # data 
IndexError: index out of bounds

Буду признателен, если кто-нибудь заглянет

благодарю вас


person George    schedule 08.05.2014    source источник


Ответы (2)


Вы говорите, что uwind определяется для каждой широты, долготы, высоты и времени, но вы даете только три индекса, когда вызываете uwind[i][i][j]. Таким образом, на выходе будет одномерный массив. Предоставление 4-го индекса, например. uwind[i,i,j,j] должен устранить ошибку.

Однако концептуально я не уверен, почему вы используете индекс latstep i для обоих первых двух измерений. Если вы просто пытаетесь записать массив во внешний файл, обратите внимание на pickle (или cPickle) встроенная библиотека. (Перебор каждой точки сетки и времени крайне неэффективен.)

Кроме того, я предполагаю, что вы используете модуль netCDF4, и в этом случае нет необходимости в преобразовании float() - значения уже будут числами с плавающей запятой (которые вы можете протестировать, например, type(uwind[0,0,0,0]).

person Spencer Hill    schedule 09.05.2014
comment
Я новичок в python, добавил еще один цикл в чтении 3-го измерения высоты, но теперь я получаю индекс за пределы.. - person George; 09.05.2014
comment
netCDF4 обычно заказывает размеры [время, высота, широта, долгота], но из нового кода, который вы опубликовали, вы индексируете, как если бы это было [высота, время, долгота]. Замена uwind[hts][t][i][j] на uwind[t,hts,i,j] решает проблему? - person Spencer Hill; 09.05.2014
comment
большое спасибо, это было немного любопытное решение, но ваш последний комментарий помог мне определить его, чего я не знал до сих пор. Я опубликую логику прямо здесь, чтобы можно было ответить на будущий вопрос. - person George; 12.05.2014

Просто сумма комментариев и найденное решение, Спенсер Хилл (в комментариях) поможет мне найти решение.

Первоначально проблема заключалась в том, что не все измерения были присвоены значению temp, каждый файл netCDF обычно имеет 3 или более измерений (помимо включенного набора данных), в этом случае 3 дополнительных измерения, где время (t), высота (ht ), широта (широта), долгота (долгота).

Чтобы увидеть данные, которые включены в netCDF, можно использовать >ncdump -h fname или ncdsip в Matlab, после некоторого поиска я обнаружил, что, хотя можно увидеть сборку переменных python в модулях netCDF, они открываются в другой логике.

Итак, после того, как вы зарегистрировали данные, включенные в файл, и идентифицировали их, сделайте это в python

>>>shape(uwind)

и вы получите что-то вроде этого

(8737, 1, 5, 9)

Хотя, если вы используете ncdump или ncdisp, представление измерения переменных может отличаться.

поэтому изначально у меня была эта строка кода из-за того, что я использовал ncdump для «открытия» содержимого файла в Linux/UNIX.

utemp = float(uwind[hts][t][i][j])

которые вызывают упоминание об ошибке.

Когда в python я попытался >shape(varname) я переписал временный файл как

 vtemp = float(vwind[t][hts][i][j])

И тогда код был написан правильно

Я надеюсь, что это будет полезно

person George    schedule 12.05.2014