Расширение ряда неоднородных данных netcdf в массиве numpy - PullRequest
1 голос
/ 15 апреля 2010

Я новичок в python, извиняюсь, если об этом уже спрашивали.

Используя python и numpy, я пытаюсь собрать данные по многим файлам netcdf в один массив, многократно вызывая append().

Наивно, я пытаюсь сделать что-то вроде этого:

from numpy import *
from pupynere import netcdf_file

x = array([])
y = [...some list of files...]

for file in y:
    ncfile = netcdf_file(file,'r')
    xFragment = ncfile.variables["varname"][:]
    ncfile.close()
    x = append(x, xFragment)

Я знаю, что в нормальных условиях это плохая идея, поскольку она перераспределяет новую память при каждом вызове append(). Но две вещи препятствуют перераспределению x:

1) Файлы не обязательно имеют одинаковый размер по оси 0 (но должны быть одинакового размера по следующим осям), поэтому мне нужно было бы заранее прочитать размеры массивов из каждого файла, чтобы предварительно рассчитать окончательный размер x.

Однако ...

2) Из того, что я могу сказать, pupynere (и другие модули netcdf) загружают весь файл в память при открытии файла, а не просто ссылку (например, многие модули netcdf в других средах). Поэтому для предварительного размещения мне придется открыть файлы дважды.

Существует много (> 100) больших (> 1 ГБ) файлов, поэтому перераспределение и изменение формы нецелесообразно, насколько я могу судить.

Мой первый вопрос: не хватает ли мне какого-то интеллектуального способа предварительного распределения.

Мой второй вопрос более серьезный. Приведенный выше фрагмент работает для одномерного массива. Но если я пытаюсь загрузить матрицу, инициализация становится проблемой. Я могу добавить одномерный массив в пустой массив:

append( array([]), array([1, 2, 3]) )

но я не могу добавить пустой массив в матрицу:

append( array([]), array([ [1, 2], [3, 4] ]), axis=0)

Что-то вроде x.extend (xFragment) будет работать, я верю, но я не думаю, что у numpy массивов есть такая функция. Я мог бы также избежать проблемы инициализации, рассматривая первый файл как особый случай, но я бы предпочел избежать этого, если есть лучший способ сделать это.

Если кто-то может предложить помощь или предложение, или может определить проблему с моим подходом, то я был бы благодарен. Спасибо

1 Ответ

1 голос
/ 15 апреля 2010

Вы можете решить две проблемы, сначала загрузив массивы из файлов файлов в список массивов, а затем используя concatenate , чтобы объединить все массивы. Примерно так:

x = [] # a normal python list, not np.array
y = [...some list of files...]

for file in y:
    ncfile = netcdf_file(file,'r')
    xFragment = ncfile.variables["varname"][:]
    ncfile.close()
    x.append(xFragment)

combined_array = concatenate(x, axis=0)
...