python - 有效地将numpy数组写入二进制文件

标签 python pandas numpy binary dask

我需要一个有效的解决方案来将大量数据写入二进制文件。目前我使用 numpy 方法 .tofile ,它消耗了大部分运行时间。我的 MWE:

import numpy as np

def writeCFloat(f, ndarray):
    np.asarray(ndarray, dtype=np.float32).tofile(f)
def writeCInt(f, ndarray):
    np.asarray(ndarray, dtype=np.int32).tofile(f)
def writeC80(f, string):
    np.asarray(string, dtype='a80').tofile(f)

if __name__ == "__main__":
    f = open('test.out', mode='wb')
    ndarray = np.zeros((10000,10000))

    writeCInt(f, ndarray)
    writeCFloat(f, ndarray)
    writeC80(f, 'coordinates')

那么有没有比目前的解决方案更有效的方法呢?提前致谢。

最佳答案

您可以使用 dask并行运行此操作。这还允许您扩展到超出单个线程的内存限制。
根据您的用例和您希望数据最终采用的文件类型,您可以执行以下操作:
MCVE

import numpy as np
import dask.array as da

def writeCFloat_dask(ndarray):
    da.from_array(ndarray).astype('float32').to_zarr('float32.zarr')
def writeCInt_dask(ndarray):
    da.from_array(ndarray).astype('int32').to_zarr('int32.zarr')
def writeC80_dask(string):
    da.from_array(string).astype('a80').to_zarr('a80.zarr')


if __name__ == "__main__":
    ndarray = np.zeros((100000,10000))

    writeCInt_dask(ndarray)
    writeCFloat_dask(ndarray)
    writeC80_dask('coordinates')
或者,如果要将所有数组写入单个文件,则可以使用以下命令写入 HDF5:
def returnCFloat_dask(ndarray):
    return da.from_array(ndarray).astype('float32')
def returnCInt_dask(ndarray):
    return da.from_array(ndarray).astype('int32')
def returnC80_dask(string):
    return da.from_array(string).astype('a80')

if __name__ == "__main__":
    ndarray = np.zeros((100000,10000))

    da_float = returnCFloat_dask(ndarray)
    da_int = returnCInt_dask(ndarray)
    da_string = returnC80_dask('coordinates')

    da.to_hdf5('test-out.hdf5', {'/float': da_float, '/int': da_int, '/string': da_string})
documentation on writing arrays to binary file types with Dask想要查询更多的信息。

关于python - 有效地将numpy数组写入二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49172608/

相关文章:

python 错误AttributeError : 'str' object has no attribute 'setdefault'

python - .apply() 双变量 numpy() lambda 函数到 pandas DataFrame 的 .expanding() 窗口

python - 在 python 中用 4 个数组数据绘制 3D 曲面图

python - 如何将 ndarray 的 dtype 更改为 numpy 中的自定义类型?

python - Python 的嵌套循环结果聚集在一起

python - 如何使用 Cyclone 和 Redis 进行身份验证

python - 如何通过 TCP/IP 损坏校验和

python - 使用混合元组和字符串列重新排序 pandas DataFrame 列

python - 如何删除 pandas.read_csv 中的索引(自动生成)

python - 为什么 numba 在 (nopython=True) 时抛出有关 numpy 方法的错误?