Не удается прочитать файл .npz в python

#python #numpy #numpy-ndarray

Вопрос:

Я создал npz(сжатый файл) , используя следующий код:

 import pandas as pd
from tqdm import tqdm
from keras.preprocessing import image
import numpy as np    # for mathematical operations
from keras.preprocessing import image   # for preprocessing the images

anomoly_data = pd.read_csv('/code_data/anomoly_data.csv')
f = open('/code_data/anomoly_data.npz', 'wb')
for i in tqdm(range(anomoly_data.shape[0])):
    img = image.load_img(anomoly_data['image'][i], target_size=(224,224,3))
    # converting it to array
    img = image.img_to_array(img)
    # normalizing the pixel value
    img = img/255
    np.savez_compressed(f, img)
f.close()
 

сжатый файл имеет размер 52 Гб, что указывает на то, что он содержит данные всех изображений.
в файле anomoly_data.csv у меня есть путь для каждого изображения, а записи в файле .csv

 188604
 

и теперь я пытаюсь прочитать данные всех изображений из сжатых, используя следующий код:

 f=open("/code_data/anomoly_data.npz","rb")
for i in tqdm(range(anomoly_data.shape[0])):
    img=np.load(f)
    print(img)
 

и затем я получаю эту ошибку, сообщающую мне, что в сжатом файле есть только один ndarray, Ошибка:

 <numpy.lib.npyio.NpzFile object at 0x7fdfd1d437c0>

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-7-29b2878e9fe9> in <module>
      1 f=open("/code_data/anomoly_data.npz","rb")
      2 for i in range(anomoly_data.shape[0]):
----> 3     img=np.load(f)
      4     print(img)
      5 

~/Programs/Anaconda/lib/python3.8/site-packages/numpy/lib/npyio.py in load(file, mmap_mode, allow_pickle, fix_imports, encoding)
    442             # Try a pickle
    443             if not allow_pickle:
--> 444                 raise ValueError("Cannot load file containing pickled data "
    445                                  "when allow_pickle=False")
    446             try:

ValueError: Cannot load file containing pickled data when allow_pickle=False

 

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

Комментарии:

1. np.save есть пример записи и загрузки нескольких массивов в один файл. Используя эту модель, вы сможете сохранять свои изображения в цикле. np.savez создает zip архив, поэтому я не знаю, работает ли там этот метод повторного сохранения. Я не видел и не тестировал рабочий пример.

2. @hpaulj я загружаю в файл только 5 изображений, используя, np.save , np.savez , np.savez__compressed а сравнение размеров составляет 3 МБ,3 МБ и 700 КБ соответственно. Я работаю с большим набором данных, поэтому использую np.save или np.savez потребляю огромное пространство памяти около 200 ГБ.

3. Что важнее-размер или функциональность? Насколько я знаю compressed , это еще один слой поверх zip архива. Я не знаю, затрудняет ли это доступ или нет. Заставьте код работать с несколькими массивами; большой размер может появиться позже.

4. Я думаю, вам нужно поэкспериментировать np.save только с одним изображением. Делайте маленькие шаги.

5. очевидно, что функциональность важнее. Большое спасибо.