Как добавить значения (несколько числовых массивов) в существующую переменную Matlab (в файле .mat), чтобы создать таблицу с помощью scipy.io.savemat ()? - PullRequest
0 голосов
/ 07 марта 2019

Context

Мне дано 177373 файла netCDF4 (общим объемом 18 ГБ). Мне нужно прочитать массив фиксированного размера (1x24) значений float32 из каждого файла и записать их в одну переменную файла .mat. Результирующая таблица в файле .mat должна иметь форму (17 373 x 24).

В каждом файле хранятся данные за один момент времени (в частности, данные за каждый час в течение примерно двух лет).

Matlab Версия: 2007b Python 3.7 scipy 1.2.1 numpy 1.15.4

Задача

Я узнал, что запись списка пустых массивов в файл .mat приведет к созданию таблицы:

import numpy as np
import scipy.io

t1 = np.arange(0,9)     # array([0,...,  8])
t2 = np.arange(10,19)   # array([10,..., 18])
pyTable = [t1, t2]      # [array([0,...,8]), array([10,...,18])]

scipy.io.savemat('mytable.mat', mdict={'mattable':pyTable})

Но мне не хватило памяти, когда я попытался сохранить 17 373 numy массива в списке.

Покушение

Так что теперь я пытаюсь записать в файл .mat при каждом доступе к файлу (то есть открыть файл .nc, извлечь интересующий массив (1x24) numpy, а затем записать эту строку в переменную mattable из mytable.mat, переходите к следующему файлу, извлекайте интересующий массив (1x24), записывайте его в mattable и т. Д.).

Я пытался играть с кодом из this Ответ переполнения стека:

from netCDF4 import Dataset 
import scipy.io

for ncfilename in ncfilenamelist:
    dataset = Dataset(ncfilename, "r", format="NETCDF4")
    with open('mytable.mat', 'ab') as f:
        numpyrow = dataset['v'][0][:,0,0]   # A (1x24) array of float32
        scipy.io.savemat(f, mdict={'mattable':numpyrow})

Но код создает файл .mat, который не может быть загружен в среду Matlab. В консоли Matlab отображается следующая ошибка:

* +1036 * ??? Ошибка при использовании ==> load Не удалось прочитать MAT-файл C: \ путь \ к \ mytable.mat Файл может быть поврежден.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...