我通常在Python中将数据保存在npz文件中。如何编写一个函数,它可以加载npz文件并自动创建出在.npz
文件中存在的数组。例如,假设有一个名为some_data.npz
的文件中包含三个数组A
、B
和C
。
我希望该函数能够加载npz
文件,即
data1 = np.load('some_data.npz')
然后自动创建三个数组,分别命名为data1A
、data1B
和data1C
,并存储原始.npz
文件中的A
、B
和C
数组。如何实现?
我通常在Python中将数据保存在npz文件中。如何编写一个函数,它可以加载npz文件并自动创建出在.npz
文件中存在的数组。例如,假设有一个名为some_data.npz
的文件中包含三个数组A
、B
和C
。
我希望该函数能够加载npz
文件,即
data1 = np.load('some_data.npz')
然后自动创建三个数组,分别命名为data1A
、data1B
和data1C
,并存储原始.npz
文件中的A
、B
和C
数组。如何实现?
如果你想要创建名称,请将数组存储在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您几乎已经可以通过由numpy.load
返回的对象的f
属性来实现这一点。例如,在下面的示例中,foo.npz
包含三个数组A
,B
和C
:
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。)# 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']
numpy.load
函数不是已经给你一个数组字典了吗?如果你只想将每个单独的数组绑定到一些花哨的名称上,那就直接赋值。或者,编写一个类并将这三个名称作为类属性。 - Cong Ma