在Python中从NumPy npz文件中加载数组

6

我通常在Python中将数据保存在npz文件中。如何编写一个函数,它可以加载npz文件并自动创建出在.npz文件中存在的数组。例如,假设有一个名为some_data.npz的文件中包含三个数组ABC

我希望该函数能够加载npz文件,即

data1 = np.load('some_data.npz')

然后自动创建三个数组,分别命名为data1Adata1Bdata1C,并存储原始.npz文件中的ABC数组。如何实现?


numpy.load 函数不是已经给你一个数组字典了吗?如果你只想将每个单独的数组绑定到一些花哨的名称上,那就直接赋值。或者,编写一个类并将这三个名称作为类属性。 - Cong Ma
@CongMa exactly。第二个例子展示了如何实现这一点。 - MattDMo
您也可以阅读此链接 https://dev59.com/KV0Z5IYBdhLWcg3whAlv#71183327 - Hamzah
3个回答

8

如果你想要创建名称,请将数组存储在dict中:

a1 = np.array([1,2,3])
a2 = np.array([4,5,6])
a3 = np.array([7,8,9])

np.savez("test", A=a1,B=a2,C=a3)
a = np.load("test.npz")
d = dict(zip(("data1A","data1B","data1C"), (a[k] for k in a)))
print(d)
{'data1A': array([4, 5, 6]), 'data1C': array([7, 8, 9]), 'data1B': array([1, 2, 3])}

如果您想在不显式传递名称的情况下创建键:
a1 = np.array([1, 2, 3])
a2 = np.array([4, 5, 6])
a3 = np.array([7, 8, 9])

np.savez("test", A=a1,B=a2,C=a3)
a = np.load("test.npz")

d = dict(zip(("data1{}".format(k) for k in a), (a[k] for k in a)))
print(d)

这不是与 np.load 返回的对象本质上相同吗?如果我错了,请纠正我。 - areuexperienced
@areuexperienced,load命令无法让你选择名称,所以如果你想要将所有数组存储为特定的名称,那么可以按照以下方法操作。 - Padraic Cunningham
明白了。只是通常在保存时会指定名称,因此这样做就变得多余了。不过你的评论仍然正确。 - areuexperienced

7

您几乎已经可以通过由numpy.load返回的对象的f属性来实现这一点。例如,在下面的示例中,foo.npz包含三个数组ABC

In [1367]: foo = np.load('foo.npz')

In [1368]: foo.keys()
Out[1368]: ['A', 'C', 'B']

In [1369]: foo.f.A
Out[1369]: array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.])

In [1370]: foo.f.B
Out[1370]: 
array([[ 0,  1],
       [-1,  0]])

In [1371]: foo.f.C
Out[1371]: array([ 3.14159265,  2.71828183,  0.57721566])

注意: 在load的docstring中未记录f属性。当load读取一个npz文件时,它将返回类NpzFile的实例。这个类可以使用numpy.lib.npyio.NpzFile调用。类NpzFile的docstring描述了f属性。(截至本篇文章撰写之时,类的源代码可以在此处找到: https://github.com/numpy/numpy/blob/master/numpy/lib/npyio.py#L95。)

1
# Assuming that you saved the original data with labels 'A', 'B', and 'C'
import numpy as np

a1 = np.array([1,2,3])
a2 = np.array([4,5,6])
a3 = np.array([7,8,9])
# Save the arrays:
np.savez_compressed('some_data.npz', A=a1,B=a2,C=a3)

# Now Load Using,
data1 = np.load('some_data.npz', 'r')
data1A = data1['A']
data1B = data1['B']
data1C = data1['C']

希望这有所帮助!!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接