Преобразование ndarray в Base64 - PullRequest
0 голосов
/ 30 марта 2020

Пользователь загружает изображение, если у этого пользователя нет другого изображения для загрузки, то это изображение сохраняется. Затем мы берем это изображение, разрезаем его на две половины. Первая половина снова сохраняется. Что касается второго изображения, нам нужно преобразовать его в изображение Base64. Однако по какой-то причине я получаю эту ошибку: ValueError: ndarray is not C-contiguous

img = q.choice_set.all()[0].img
reader = misc.imread(img)
height, width, _ = reader.shape
with_cutoff = width // 2
s1 = reader[:, :with_cutoff]
s2 = reader[:, with_cutoff:]
misc.imsave(settings.MEDIA_ROOT + "/" + img.name, s2)
validated_data["choiceimage"] = base64.b64encode(s2)

Когда я сохраняю это в базе данных, я получаю ошибку. Что я делаю неправильно? Как я могу декодировать массив numpy в base64?

1 Ответ

1 голос
/ 31 марта 2020

Если вы возьмете 2D-массив и извлечете левую или правую половину, он больше не будет непрерывным в памяти - между строками будут пробелы.

x = np.arange(6).reshape(2,3)

дает x:

array([[0, 1, 2],
       [3, 4, 5]])

Если мы извлечем центральный столбец в y:

y = x[:,1:2]

, то получим y:

array([[1],
       [4]])

, но если мы проверим, является ли он смежным в память:

y.flags['C_CONTIGUOUS']

дает:

False

Решение состоит в том, чтобы извлечь столбец в непрерывный массив:

y = np.ascontiguousarray(x[:,1:2])
y.flags['C_CONTIGUOUS']

дает:

True
...