正如@fraxel已经建议的那样,在这种情况下,使用pickle是更好的选择。只需将
dict您的物品保存在其中即可。
但是,请确保将pickle与二进制协议一起使用。默认情况下,它的效率较低,如果阵列很大,则会导致过多的内存使用和巨大的文件。
saved_data = dict(outputFile, saveFeature1 = feature1, saveFeature2 = feature2, saveLabel1 = label1, saveLabel2 = label2, saveString = docString)with open('test.dat', 'wb') as outfile: pickle.dump(saved_data, outfile, protocol=pickle.HIGHEST_PROTOCOL)
话虽如此,为了说明起见,让我们更详细地了解正在发生的事情。
numpy.savez希望每个项目都是一个数组。实际上,它会调用
np.asarray您传递的所有内容。
如果将a
dict转换为数组,则会得到一个对象数组。例如
import numpy as nptest = {'a':np.arange(10), 'b':np.arange(20)}testarr = np.asarray(test)
同样,如果您使用字符串制作数组,则会得到一个字符串数组:
In [1]: np.asarray('abc')Out[1]: array('abc', dtype='|S3')
但是,由于对象数组的处理方式存在怪异,如果您传入的
dict不是元组,列表或数组的单个对象(在您的情况下,您的),您将获得一个0维对象数组。
这意味着您不能直接对其进行索引。实际上,这样做
testarr[0]会提高
IndexError。数据仍然存在,但是您需要首先添加维度,所以必须这样做
yourdictionary= testarr.reshape(-1)[0]。
如果所有这些看起来笨拙,那是因为。对象数组本质上总是错误的答案。(虽然
asarray应该可以说是传递
ndmin=1到
array,这将解决这个特定的问题,但可能会破坏其他的东西。)
savez用于存储数组,而不是存储任意对象。由于它的工作方式,它 可以 存储完全任意的对象,但不应以这种方式使用。
但是,如果您确实想使用它,则可以采用以下快速解决方法:
np.savez(outputFile, saveFeature1 = [feature1], saveFeature2 = [feature2], saveLabel1 = [label1], saveLabel2 = [label2], saveString = docString)
然后,您可以使用
loadedArchive = np.load(outFile)loadedFeature1 = loadedArchive['saveFeature1'][0]loadedString = str(loadedArchive['saveString'])
但是,这显然比仅使用泡菜要笨重得多。使用
numpy.savez当你刚刚保存的阵列。在这种情况下,您要保存嵌套的数据结构,而不是数组。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)