【发布时间】:2017-03-21 00:43:27
【问题描述】:
我正在使用存储在列表中的 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 会出现这种奇怪的行为。我是否遗漏了什么,或者我必须使用正则表达式来解决这个问题?
【问题讨论】:
-
data是一个类似字典的对象,允许通过data['arr_0']访问单个数组。字典的键是无序的。 -
@hpaulj:
data类似于字典,data.files不是。 -
也许是有意的,
savezdocs 示例显示了改组的变量名称。目的是数组将按名称而不是按列表顺序返回。
标签: arrays numpy python-3.5