Чтение и запись данных массивов в файлы / np 9

Важный аспект NumPy, которому пока не уделялось внимание — процесс чтения данных из файла. Это очень важный момент, особенно когда нужно работать с большим количеством данных в массивах. Это базовая операция анализа данных, поскольку размер набора данных почти всегда огромен, и в большинстве случаев не рекомендуется работать с ним вручную.NumPy предлагает набор функций, позволяющих специалисту сохранять результаты вычислений в текстовый или бинарный файл. Таким же образом можно считывать и конвертировать текстовые данные из файла в массив.

Загрузка и сохранение данных в бинарных файлах

NumPy предлагает пару функций, save() и load(), которые позволяют сохранять, а позже и получать данные, сохраненные в бинарном формате.

При наличии массива, который нужно сохранить, содержащего, например, результаты анализа данных, остается лишь вызвать функцию call() и определить аргументы: название файла и аргументы. Файл автоматически получит расширение .npy.

>>> data=([[ 0.86466285, 0.76943895, 0.22678279],
           [ 0.12452825, 0.54751384, 0.06499123],
           [ 0.06216566, 0.85045125, 0.92093862],
           [ 0.58401239, 0.93455057, 0.28972379]])
>>> np.save('saved_data',data)

Когда нужно восстановить данные из файла .npy, используется функция load(). Она требует определить имя файла в качестве аргумента с расширением .npy.

>>> loaded_data = np.load('saved_data.npy')
>>> loaded_data
array([[ 0.86466285, 0.76943895, 0.22678279],
       [ 0.12452825, 0.54751384, 0.06499123],
       [ 0.06216566, 0.85045125, 0.92093862],
       [ 0.58401239, 0.93455057, 0.28972379]])

Чтение файлов с табличными данными

Часто данные для чтения или сохранения представлены в текстовом формате (TXT или CSV). Их можно сохранить в такой формат вместо двоичного, потому что таким образом к ним можно будет получать доступ даже вне NumPy, с помощью других приложений. Возьмем в качестве примера набор данных в формате CSV (Comma-Separated Values — значения, разделенные запятыми). Данные здесь хранятся в табличной форме, а значения разделены запятыми.

id,value1,value2,value3 
1,123,1.4,23 
2,110,0.5,18 
3,164,2.1,19

Для чтения данных в текстовом файле и получения значений в массив NumPy предлагает функцию genfromtxt(). Обычно она принимает три аргумента: имя файла, символ-разделитель и указание, содержат ли данные заголовки колонок.

>>> data = np.genfromtxt('ch3_data.csv', delimiter=',', names=True)
>>> data
array([(1.0, 123.0, 1.4, 23.0), (2.0, 110.0, 0.5, 18.0),
       (3.0, 164.0, 2.1, 19.0)],
      dtype=[('id', '<f8'), ('value1', '<f8'), ('value2', '<f8'), ('value3', '<f8')])

Как видно по результату, можно запросто получить структурированный массив, где заголовки колонок станут именами полей.

Эта функция неявно выполняет два цикла: первый перебирает строки одна за одной, а вторая — разделяет и конвертирует значения в них, вставляя специально созданные последовательные элементы. Плюс в том, что даже при недостатке данных функция их дополнит.

Возьмем в качестве примера предыдущий файл с удаленными элементами. Сохраним его как data2.csv.

id,value1,value2,value3 
1,123,1.4,23 
2,110,,18 
3,,2.1,19

Выполнение этих команд приведет к тому, что genfromtxt() заменит пустые области на значения nan.

>>> data2 = np.genfromtxt('ch3_data2.csv', delimiter=',', names=True) 
>>> data2 array([(1.0, 123.0, 1.4, 23.0), (2.0, 110.0, nan, 18.0), 
                 (3.0, nan, 2.1, 19.0)], 
                dtype=[('id', '<f8'), ('value1', '<f8'), ('value2', '<f8'),
                ('value3', '<f8')])

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

>>> data2['id'] 
array([ 1., 2., 3.])

А с помощью числовых значений можно получать данные из конкретных строк.

>>> data2[0] 
(1.0, 123.0, 1.4, 23.0)