Как добавить массивы numpy в текстовый файл

#numpy #python-imaging-library

#numpy #python-imaging-library

Вопрос:

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

 from PIL import Image
import numpy as np
import os

data = os.listdir("inputs")
print(len(data))

with open('np_arrays.txt', 'a ') as file:
    for dt in data:
        img = Image.open("inputs\"   dt)
        np_img = np.array(img)
        file.write(np_img)
        file.write('n')
 

но file.write() требуется строка и не принимает numpy ndarray. Как я могу это решить?

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

1. Как вы хотите, чтобы этот текст выглядел? Массив, созданный из «изображения», вероятно, будет чем-то большим и многомерным, например (640,400,3) . Это не приведет к созданию пригодного для использования текста, особенно одной строки. Также как вы собираетесь использовать этот файл, то есть перезагрузить эти «изображения»?

2. В нынешнем виде это не имеет особого смысла. Крайне неэффективно записывать изображения в виде текста — есть причина, по которой у нас есть JPEG и PNG. Не могли бы вы объяснить подробнее, пожалуйста? Моя камера сохраняет файлы размером 40 МБ, если бы она записывала их в виде текста, они занимали бы в 20 раз больше места.

Ответ №1:

Numpy также позволяет сохранять непосредственно в .txt файлы с np.savetxt помощью . Я все еще не совсем уверен, в каком формате вы хотите, чтобы ваш текстовый файл был, но решение может быть чем-то вроде:

 from PIL import Image
import numpy as np
import os

data = os.listdir("inputs")
print(len(data))

shape = ( len(data), .., .., ) # input the desired shape

np_imgs = np.empty(shape)

for i, dt in enumerate(data):
    img = Image.open("inputs\"   dt)
    np_imgs[i] = np.array(img) # a caveat here is that all images should be of the exact same shape, to fit nicely in a numpy array

np.savetxt('np_arrays.txt', np_imgs) 
 

Обратите внимание, что np.savetxt() в нем есть много параметров, которые позволяют вам точно настроить выводимый текстовый файл.

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

1. shape = ( len(data), .., .., ) это выдает ошибку. Для чего нужны эти 2 эллипса?

2. Это для вас, чтобы заполнить форму. np.array(img) Как я уже упоминал, это будет работать, только если все ваши img-файлы имеют ту же форму, что и массивы numpy.

3. В каком порядке?

4. Это основной порядок размеров массива, с которым работает numpy. Посмотрите, как np.array().shape это работает.

Ответ №2:

write() Функция допускает только строки в качестве входных данных. Попробуйте использовать numpy.array2string .

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

1. Есть ли способ вернуться numpy.array2string к чему-то подобному numpy.string2array ?

2. Да, есть способ отменить операцию с помощью numpy.fromstring() . Просто убедитесь, что вы учитываете квадратные скобки, которые numpy.array2string добавляются по умолчанию. Например, если у вас есть test = np.array([1, 2, 3, 4]) и testString = np.array2string(test) , операция преобразования обратно в массив numpy будет np.fromstring(testString[1:-1], dtype='int', sep = " ") .

3. Результат выглядит следующим образом: [[[111 60 0] [116 65 0] [122 69 0] ... [ 97 47 0] [ 99 47 0] [100 49 0]] [[111 61 0] [118 65 0] [122 69 0] Многоточие указывает на то, что массив усечен. Есть ли способ вывести все это целиком?

4. Как я и предполагал, массив имеет размер 3d (n, m, 3). Хотя это многоточие можно отключить, разбор такого текста все равно будет затруднительным. Вам действительно нужно / хотите написать такой текстовый файл? Общий формат текстового файла csv , который подходит для 2d-таблиц, — один массив / таблица на файл.

5. Можем ли мы отключить многоточие?