#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. Можем ли мы отключить многоточие?