Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将大型NumPy数组写入文件的有效方法_Python_Numpy_Scientific Computing - Fatal编程技术网

Python 将大型NumPy数组写入文件的有效方法

Python 将大型NumPy数组写入文件的有效方法,python,numpy,scientific-computing,Python,Numpy,Scientific Computing,我目前有一个在PiCloud上运行的项目,涉及到ODE解算器的多次迭代。每次迭代产生一个大约30行1500列的NumPy数组,每次迭代都附加到先前结果数组的底部 通常,我会让函数返回这些相当大的数组,将它们保存在内存中,然后一次性处理它们。除了PiCloud对函数可以输出和返回的数据大小有相当严格的限制,以降低传输成本。这很好,但这意味着我必须启动数千个作业,每个作业都在迭代中运行,并且有相当大的开销 最好的解决方案似乎是将输出写入文件,然后使用另一个没有传输限制的函数收集文件 我的最佳选择是将

我目前有一个在PiCloud上运行的项目,涉及到ODE解算器的多次迭代。每次迭代产生一个大约30行1500列的NumPy数组,每次迭代都附加到先前结果数组的底部

通常,我会让函数返回这些相当大的数组,将它们保存在内存中,然后一次性处理它们。除了PiCloud对函数可以输出和返回的数据大小有相当严格的限制,以降低传输成本。这很好,但这意味着我必须启动数千个作业,每个作业都在迭代中运行,并且有相当大的开销

最好的解决方案似乎是将输出写入文件,然后使用另一个没有传输限制的函数收集文件


我的最佳选择是将其转储到CSV文件中吗?我应该在每次迭代中添加到CSV文件中,还是将其全部保存在一个数组中直到结束,然后只写一次?我是否缺少一些非常聪明的东西?

我建议查看
pickle
模块。
pickle
模块允许您将python对象序列化为字节流(例如字符串)。这允许您将它们写入文件或通过网络发送,然后稍后重新实例化对象。

除非中间文件是人类可读的,否则不要使用CSV,因为这将不可避免地涉及精度损失

最有效的可能是
tofile
(),它用于在您提前知道数据的所有属性时将文件快速转储到磁盘

对于独立于平台但特定于numpy的保存,可以使用
save
()

如果需要便携性,Numpy和scipy还支持HDF5等各种科学数据格式

试试看

joblib的一个关键组件是它能够持久化任意Python对象,并快速地将它们读回。它对于使用numpy阵列进行重载的容器尤其有效。实现高速的诀窍是将numpy数组保存在单独的文件中,并通过memmapping加载它们

编辑:

它们真的没有一个让人可读的理由——只是习惯于使用CSV文件在数据集之间移动,而精度实际上不是一个因素(大多数东西都是整数)。这似乎是我想要的。使用cPickle而不是pickle,它要快得多。pickle很适合立即使用,但当您必须跨python版本移植它时,不应该使用它(它不向后兼容,即3.x无法读取2.x的二进制数据,不管文档怎么说)使用numpy本机的npy格式。()