Сохранение последовательности тензоров 3-го порядка и чтение ее обратно без потери формата массива - PullRequest
1 голос
/ 23 апреля 2019

Python 3.7, Numpy: мне нужно сохранить объект 3-го порядка, который был создан с помощью Numpy. Это список массивов, если быть точным. После загрузки массивы умножаются на векторы с помощью numpy.dot (). Есть ли способ сохранить этот объект (например, в .txt-файл) без потери его формата?

Если я просто помещаю объект в .txt-файл с помощью .write (), я преобразую его в строку. Конечно, я мог бы преобразовать это обратно в массив float, но прежде чем я это сделал, я хотел узнать, есть ли более простой или более эффективный способ сделать это.

Это будет выглядеть примерно так:

    BigObject = []
    for i in (0, Size1):
        BigObject.append(np.random.uniform(-1, 1, (Size2, Size3)))

    with open("test.txt", "w+") as output:
        output.write(str(BigObject))

Как мне сохранить и

    with open("test.txt", "r") as input:
        NewBigObject = input.read()

как я это читаю.

Это возвращает мне строку для NewBigObject, которую я не могу умножить в матрице на вектор.

Способ сохранения BigArray не имеет значения. Я просто хочу знать, есть ли умный способ сохранить его без потери формата. Теперь я мог запустить серию команд split() и float(), чтобы вернуть исходный объект. Но можно ли сделать это быстрее или элегантнее?

1 Ответ

1 голос
/ 23 апреля 2019

Вот способ сохранить массивы как dict, но не как list (потому что сохранение его как списка объединяет все массивы в один, который нам не нужен), а затем загружает его для чтения без потеря формата массива.

# sample array to work with
In [76]: arr = np.arange(12).reshape(4, 3)

# make a dict of say 4 copies of the array
In [77]: dict_of_arrs = {idx: arr for idx in range(4)}

# serialize it to disk; will be saved as `serialized_arrays.npy`
In [78]: np.save('serialized_arrays', dict_of_arrs)

# load it back for reading/processing
In [79]: loaded_arrs = np.load('serialized_arrays.npy')

# flatten it out and just take the 0th element in the list.
In [80]: loaded_arrs.ravel()[0]
Out[80]: 
{0: array([[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11]]), 1: array([[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11]]), 2: array([[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11]]), 3: array([[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11]])}

Выше вернется дикт; Затем вы можете перебрать этот dict и получить доступ к массивам. Если вы предпочитаете, вы можете дать некоторые разумные ключи при создании dict dict_of_arrs.

...