要保存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
它将打印一个空列表[]
。怎么可能是空的?
答案 0 :(得分:1)
您无需打开文件即可使用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]
答案 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数组可能会出现问题。他们的数据缓冲区具有指向内存中其他对象的指针。指针在保存/加载序列中无效。因此,它必须使用酸洗。