Сохранить массив пустых списков Python - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь скопировать формат существующего файла данных, который имеет следующую структуру классов при загрузке с np.load:

<class 'numpy.ndarray'>
    <class 'list'>
        <class 'list'>
           <class 'numpy.str_'>

Это ndarray со списками списков строк.

Я использую следующий код для создания той же структуры, списка списков списков строк и пытаюсь преобразовать самый внешний список в ndarray без преобразования внутренних списков в ndarrays .

captions = []
for row in attrs.iterrows():

    sorted_row = row[1].sort_values(ascending=False)

    attributes, variations = [], []
    for col, val in sorted_row[:20].iteritems():
        attributes.append([x[1] for x in word2Id if x[0] == col][0])
    variations.append(attributes)

    for i in range(9):
        variations.append(random.sample(attributes, len(attributes)))

    captions.append(variations)

np.save('train_captions.npy', captions)

Когда я открываю полученный npy файл, иерархия классов выглядит следующим образом:

<class 'numpy.ndarray'>
    <class 'numpy.ndarray'>
        <class 'numpy.ndarray'>
           <class 'numpy.str_'>

Как сохранить captions в приведенном выше коде, чтобы он имел ту же структуру, что и файл в самом верху.

Ответы [ 2 ]

0 голосов
/ 13 января 2019
import numpy as np

list = ["a", "b", "c", "d"]
np.save('list.npy', list)
read_list = np.load('list.npy').tolist()
print(read_list, type(read_list))

>>>['a', 'b', 'c', 'd'] <class 'list'>

Если мы не используем .tolist(), результат будет:

['a' 'b' 'c' 'd'] <class 'numpy.ndarray'>
0 голосов
/ 02 мая 2018

Когда я пытаюсь повторить ваш код (более или менее):

In [273]: captions = []
In [274]: for r in range(2):
     ...:     attributes, variations = [], []
     ...:     for c in range(2):
     ...:         attributes.append([i for i in ['a','b','c']])
     ...:     variations.append(attributes)
     ...:     for i in range(2):
     ...:         variations.append(random.sample(attributes, len(attributes)))
     ...:     captions.append(variations)
     ...:         
In [275]: captions
Out[275]: 
[[[['a', 'b', 'c'], ['a', 'b', 'c']],
  [['a', 'b', 'c'], ['a', 'b', 'c']],
  [['a', 'b', 'c'], ['a', 'b', 'c']]],
 [[['a', 'b', 'c'], ['a', 'b', 'c']],
  [['a', 'b', 'c'], ['a', 'b', 'c']],
  [['a', 'b', 'c'], ['a', 'b', 'c']]]]

Список имеет несколько уровней вложенности. Когда передано np.array, результатом является 4d массив строк:

In [276]: arr = np.array(captions)
In [277]: arr.shape
Out[277]: (2, 3, 2, 3)
In [278]: arr.dtype
Out[278]: dtype('<U1')

Где возможно np.array пытается создать массив как можно большего размера.

Чтобы создать массив списков, мы должны сделать что-то вроде:

In [279]: arr = np.empty(2, dtype=object)
In [280]: arr[0] = captions[0]
In [281]: arr[1] = captions[1]
In [282]: arr
Out[282]: 
array([list([[['a', 'b', 'c'], ['a', 'b', 'c']], [['a', 'b', 'c'], ['a', 'b', 'c']], [['a', 'b', 'c'], ['a', 'b', 'c']]]),
       list([[['a', 'b', 'c'], ['a', 'b', 'c']], [['a', 'b', 'c'], ['a', 'b', 'c']], [['a', 'b', 'c'], ['a', 'b', 'c']]])],
      dtype=object)
...