我无法加载刚刚保存的numpy .npy文件

时间:2019-07-01 20:30:52

标签: python numpy

要保存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.8MB。

当我尝试加载并阅读它时:

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 个答案:

答案 0 :(得分:1)

您无需打开文件即可使用numpynp.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]

答案 1 :(得分:1)

让我们将多个文件保存到一个文件中

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数组可能会出现问题。他们的数据缓冲区具有指向内存中其他对象的指针。指针在保存/加载序列中无效。因此,它必须使用酸洗。