【发布时间】:2021-09-29 18:29:17
【问题描述】:
在应用了一些程序之后,我得到了数百万个 numpy 数组(在下面的例子中,程序将 e 转换为一个 numpy 数组):
for e in l:
procedure(e)
如何将每次迭代正确保存到单个 numpy 文件中以供以后读取和加载?
到目前为止,我尝试了两个选项,使用 np.savez:
for i, e in enumerate(l):
np.savez(f'/Users/user/array.npz',i=e)
还有熊猫:
(1) 保存到单个文件中:
for e in l:
arr = pd.DataFrame(procedure(i)).T
arr.to_csv('/Users/user/Downloads/arr.csv', mode='a', index=False, header=False)
(2) 阅读:
arr = np.genfromtxt("/Users/user/Downloads/arr.csv", delimiter=',', dtype='float32', float_format='%.16f')
到目前为止,有效的解决方案是使用 pandas。但是,我想我在 numpy 矩阵中失去了精确度。因为没有像这样的值(使用 e):
-6.82821393e-01 -2.65419781e-01
我得到这样的值:
-0.6828214 , -0.26541978
但是,numpy 矩阵没有正确保存。
在 for 循环迭代之后将每个 numpy 矩阵转储到单个文件中的最有效和正确的方法是什么?
【问题讨论】:
-
要加载
savez,您需要先阅读savez文档!savez用于一次保存多个数组。它不会将连续调用附加到一个文件。我有一种感觉,您正在尝试编写代码而没有过多关注官方文档。 -
@hpaulj 我明白了,所以在这种情况下 savez 不适用,这就是我尝试使用 pandas 但数组似乎不同的原因。关于如何在迭代后将它们附加到单个文件中的任何想法?
-
csv格式是文本,适用于二维表 - 多行和一致的列数。虽然您可以多次附加到文件,但如果列数发生变化,则加载很困难。但首先,请告诉我们一些关于您要保存的数组的信息。它们的形状(和 dtype)是否不同?如果它们的形状足够匹配,您可以将它们连接成一个数组,然后保存。如果它们不同,您需要一种文件格式来处理不同的对象集。pickle是一个,但我不记得它是否可以迭代使用。 -
它们的形状都一样。它们在 dtype 或 shape 上没有区别,它们都具有相同的值。现在的问题是精度的损失@hpaulj
-
您可以
np.stack它们(或集群)并使用np.save来写入数组。save不会降低精度。savetxt这样做是因为 ir 写入字符串。