numpy.load以错误的顺序检索savez' ed数组

时间:2016-11-07 15:47:34

标签: arrays numpy python-3.5

我正在使用存储在列表中的numpy数组。这些数组没有单独的名称,我只是通过列表中的索引来调用它们。

我需要一起保存和检索它们,因此我使用numpy.savez将它们存储到一个文件中。由于我的数组未命名,我只是列举了列表,numpy.savez为它们分配了自动名称" arr_0"," arr_1"等等。

但是当我尝试使用numpy.load检索它们时,我发现numpy.load以看似随机的顺序列出了数组。当然,我可以在恢复数组之前对此列表进行排序,但我发现很奇怪,没有直接的方法来存储和检索未命名数组的有序列表。

这是一段用于演示该事物的测试代码:

import numpy as np

arr_list = []
for i in range(15):
    arr_list.append(np.array(range(i, i+6)).reshape(2, 3))

np.savez('testfile', *arr_list)
with np.load('testfile.npz') as data:
    print(data.files)

这就是我得到的:

>>> ['arr_1', 'arr_3', 'arr_13', 'arr_11', 'arr_14', 'arr_10', 'arr_8', 'arr_0', 
     'arr_2', 'arr_9', 'arr_5', 'arr_4', 'arr_6', 'arr_12', 'arr_7']

更重要的是,我从未得到过两次相同的结果。接下来尝试:

>>> ['arr_6', 'arr_11', 'arr_10', 'arr_13', 'arr_0', 'arr_7', 'arr_5', 'arr_3', 
     'arr_14', 'arr_2', 'arr_8', 'arr_12', 'arr_1', 'arr_9', 'arr_4']

不幸的是,我不能只使用sorted()对列表进行排序,因为结果不是我需要的(这就是为什么我在列表中提供了超过10个项目的例子):

>>> ['arr_0', 'arr_1', 'arr_10', 'arr_11', 'arr_12', 'arr_13', 'arr_14', 'arr_2', 
     'arr_3', 'arr_4', 'arr_5', 'arr_6', 'arr_7', 'arr_8', 'arr_9']

我无法弄清楚为什么numpy.savez + numpy.load会产生如此奇怪的行为。我错过了什么,或者我必须使用正则表达式来解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

这是由于numpy中savez的实施。查看source code of savez,我们看到要保存的数组列表(包含在args参数中)被添加到包含要存储的数组的字典中(kwargs参数)。 args列表中的数组顺序可能会在此阶段丢失(取决于所使用的Python版本)。

由于你知道文件名的格式,你可以对它们进行排序

sorted_files = sorted(data.files, key=lambda x:int(x[4:]))

或重新创建列表

sorted_files = ['arr_{}'.format(i) for i in range(len(data.files))]