Как преобразовать ndarray формы (h, w, c) в подобный файлу объект - PullRequest
1 голос
/ 20 марта 2020

Я пытаюсь преобразовать ndarray формы (h,w,c) в файлоподобный объект с операцией чтения.

Идея состоит в том, чтобы поместить файл в память и отправить его в качестве параметра AWS S3 bucket.

Вот пример кода:

def arr_to_file(ndarray, key, bucket):
  img = Image.fromarray(ndarray)

  s3.upload_fileobj(
    img, # The problem is here. Image does not implement a read method
    bucket,
    key
  )

ndarray sample:

[[[135 114 177]
  [123 131 174]
  [111 138 179]
  ...
  [130 111 170]
  [139 127 155]
  [144 124 143]]

 [[125 133 182]
  [119 133 182]
  [104 148 182]
  ...
  [129 118 165]
  [142 116 160]
  [145 112 155]]

 [[125 151 186]
  [115 145 187]
  [ 96 154 185]
  ...
  [105 125 160]
  [123 109 163]
  [117 127 161]]

 ...

 [[ 97 124 127]
  [113 119 129]
  [124 111 141]
  ...
  [ 74 110  85]
  [ 63  94  96]
  [ 65  85 105]]

 [[116 102 124]
  [116 128 117]
  [119 115 154]
  ...
  [ 82  80  95]
  [ 85  89  95]
  [ 85  89  97]]

 [[113 131 116]
  [107 155 108]
  [114 130 151]
  ...
  [ 88  39 102]
  [105  75  98]
  [100  91  97]]]

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Понял, вот что я сделал:

img = Image.fromarray(ndarray)
img_obj = io.BytesIO()
img.save(img_obj, format="jpeg")
img_obj.seek(0)

Это создает img_obj в памяти, которую можно передать в S3 Bucket.

0 голосов
/ 20 марта 2020

Изменить (получил это для работы с ndarrays, изменив функции сохранения / загрузки):

Numpy имеет встроенную функцию сохранить и загрузить в сохранить .npy файлы. У меня сработало следующее:

>>> import numpy as np
>>> a = np.random.rand(2, 2, 2)
>>> np.save("test", a)
>>> g = np.load("test.npy")

Редактировать еще раз:

>>> from tempfile import TemporaryFile
>>> outfile = TemporaryFile()

>>> x = np.arange(10)
>>> np.save(outfile, x)

>> #send outfile to S3 somehow...

>>> _ = outfile.seek(0) # Only needed here to simulate closing & reopening file
>>> f = np.load(outfile)
...