Я не могу загрузить только что сохраненный файл .npy - PullRequest
0 голосов
/ 01 июля 2019

Чтобы сохранить массив numpy, я делаю:

save_tokens = 'myfile.npy'
token_file = open(save_tokens, 'ab')

tokens = np.array([], dtype='object')
line_count = 0
tokens_to_save = np.array([], dtype='object')
with open(self.corpus_file) as infile:
    for line in infile:
        if line_count % 1000 == 0:
            print("Line Count: ", line_count, '')
            if save_tokens is not None:
                np.save(token_file, tokens_to_save)
                tokens_to_save = np.array([], dtype='object')
        line_count += 1
        line_tokens = pygments.lex(line + '\n', self.lexer)
        for line_token in line_tokens:
            tokens = np.append(tokens, line_token[1])
            tokens_to_save = np.append(tokens_to_save, line_token[1])
        if line_count % 10000 == 0:
            print("\tToken Count: ", len(tokens))

np.save(token_file, tokens_to_save)

Я могу подтвердить, что он сохраняет, и есть файл с именем myfile.npy, это 1,8 МБ.

КогдаЯ пытаюсь загрузить и прочитать его:

f = open('myfile.npy', 'rb')
self.tokens = np.load(f, allow_pickle=True)
[print(token) for token in self.tokens]
print(self.tokens)
f.close()
return self.tokens

Я также попытался:

self.tokens = np.load('myfile.npy', allow_pickle=True)
[print(token) for token in self.tokens]
print(self.tokens)
return self.tokens

Он печатает пустой список [].Как это может быть пустым?

Ответы [ 2 ]

1 голос
/ 02 июля 2019

давайте сделаем несколько сохранений в один файл:

In [92]: ofile = open('test.npy', 'ab')                                                                         
In [93]: np.save(ofile, np.array([], object))                                                                   
In [94]: arr = np.array([], object)                                                                             
In [95]: arr = np.append(arr, np.array([1,2,3]))                                                                
In [96]: arr                                                                                                    
Out[96]: array([1, 2, 3], dtype=object)
In [97]: arr = np.append(arr, np.array([1,2,3]))                                                                
In [98]: arr                                                                                                    
Out[98]: array([1, 2, 3, 1, 2, 3], dtype=object)
In [99]: np.save(ofile, arr)                                                                                    
In [100]: np.save(ofile, np.arange(12).reshape(3,4))                                                            
In [101]: ofile.close() 

Выполните обычную загрузку:

In [103]: np.load('test.npy', allow_pickle=True)                                                                
Out[103]: array(['✪'], dtype=object)

Похоже, я получил этот оригинальный массив [], но каково его содержимое?

Вместо этого откройте файл и попробуйте повторить загрузку:

In [107]: f = open('test.npy', 'rb')                                                                            
In [108]: np.load(f, allow_pickle=True)                                                                         
Out[108]: array(['✪'], dtype=object)             # one 
In [109]: np.load(f, allow_pickle=True)                                                                         
Out[109]: array([], dtype=object)                # two
In [110]: np.load(f, allow_pickle=True)                                                                         
Out[110]: array([1, 2, 3, 1, 2, 3], dtype=object)    # three
In [111]: np.load(f, allow_pickle=True)              # four                                                           
Out[111]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
In [112]: np.load(f, allow_pickle=True)                                                                         
---------------------------------------------------------------------------
EOFError 

Так что да, можно сохранить и загрузить несколько массивов в один файл, но это не так, как было задумано.np.savez предназначен для сохранения нескольких файлов.А сохранение массивов dtype объекта может быть проблематичным.Их буфер данных имеет указатели на объекты, находящиеся где-то в памяти.Указатели недопустимы в последовательности сохранения / загрузки.Так что вместо этого нужно использовать травление.

1 голос
/ 01 июля 2019

Вам не нужно открывать файл для чтения или вывода массива numpy, используя np.load и np.save.

Для сохранения должно быть следующее:

np.save('myfile',tokens_to_save)

А затем загрузить следующее:

self.tokens = np.load('myfile.npy', allow_pickle=True)

Редактировать

Вы не можете итеративно сохранить массив numpy, как этот.Если вы хотите сделать это итеративно, сохраните его как текстовый файл.np.save перезапишет файл со временем, как вы его называете.Рассмотрим приведенный ниже пример:

np.save('test',np.arange(0,100,10))

np.save('test',np.arange(0,200,10))
p = np.load('test.npy',)

print p

Единственный вывод, когда вы его читаете, это [ 0 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...