Я не уверен, что вы пытаетесь достичь, но вы можете base-64 кодировать любой объект, который имеет представление bytes
.В приведенном вами примере вы кодируете пустой массив в base64.
Это работает, потому что пустой массив имеет форму bytes
.Вы можете достичь его, обернув bytes()
вокруг массива или используя метод .tobytes()
.
import numpy as np
x = np.array([1,2,3])
bytes(x)
# returns:
b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00'
x.tobytes()
# returns:
b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00'
Поскольку у нас есть bytes
представление массива, вы можете передать его в base64кодировщик.Обратите внимание, что если объект не является байтовоподобным объектом, он base64
попытается преобразовать его перед кодированием, как в следующем примере:
base64.b64encode(x)
# returns
b'AQAAAAIAAAADAAAA'
base64.b64encode(x.tobytes())
# returns
b'AQAAAAIAAAADAAAA'
Массив байтов не является чем-то особенным.Это просто последовательность чисел!Вот и все.Вы полагаете, что не восстановили массив numpy, потому что процесс кодирования-декодирования все еще просто оставляет вас с результатом x.tobytes()
, а не x
.
Чтобы вернуть исходный объект, вам необходим интерфейс, который может считывать последовательность байтов и возвращать какой-либо объект.К счастью, numpy может сделать это с помощью функции frombuffer
.Однако вам нужно будет указать numpy, какой тип массива он читает в байтах.
Другими словами, у вас может быть массив int32
и массив int16
, которые имеют идентичные представления байтов, но для восстановления правильного вам нужно указать numpy, какой тип TYPE правильный.Так что вам нужны какие-то знания об объекте.
x = np.array([1,2,3])
# encode as base 64
x_64 = base64.b64encode(x.tobytes())
# decode back to bytes
x_bytes = base64.b64decode(x_64)
# use numpy to recreate original array of ints
np.frombuffer(x_bytes, dtype=int)
# returns:
np.array([1, 2, 3])
Если вы хотите сохранить объект, а затем восстановить его позже, этот процесс называется сериализацией.Есть два очень хороших пакета, которые обрабатывают сериализацию, первый находится в стандартной библиотеке, вызывает pickle
, второй называется dill
и может обрабатывать более сложные объекты.
import pickle
x = np.array([1,2,3])
pickled_x = pickle.dumps(x)
# pickled_x is a bytes-object that is a hard to read by humans.
pickle.loads(x)
# returns:
np.array([1, 2, 3])