gpt4 book ai didi

python struct.pack 和 write 与 matlab fwrite

转载 作者:太空宇宙 更新时间:2023-11-03 20:33:01 27 4
gpt4 key购买 nike

我正在尝试将这段 matlab 代码移植到 python

ma​​tlab

function write_file(im,name)
fp = fopen(name,'wb');

M = size(im);

fwrite(fp,[M(1) M(2) M(3)],'int');
fwrite(fp,im(:),'float');

fclose(fp);

其中 im 是一个 3D 矩阵。据我了解,该函数首先写入一个二进制文件,其标题行包含矩阵大小。 header 由 3 个整数组成。然后,im 被写成一列 float 。在 matlab 中,对于 150MB 的文件,这需要几秒钟。

python

import struct
import numpy as np
def write_image(im, file_name):

with open(file_name, 'wb') as f:
l = im.shape[0]*im.shape[1]*im.shape[2]

header = np.array([im.shape[0], im.shape[1], im.shape[2]])
header_bin = struct.pack("I"*3, *header)
f.write(header_bin)

im_bin = struct.pack("f"*l,*np.reshape(im, (l,1), order='F'))
f.write(im_bin)
f.close()

其中 im 是一个 numpy 数组。当我与 matlab 返回的二进制文件进行比较时,这段代码运行良好,它们是相同的。但是,对于 150MB 的文件,它需要几秒钟的时间并且会耗尽所有内存(在链接的图像中我停止了执行以避免它,但你可以看到它是如何累积的!)。

see memory usage

这对我来说没有意义,因为我在 15GB RAM PC 上运行该功能。为什么一个 150MB 的文件处理需要这么多内存?

我很乐意使用不同的方法,只要标题和数据列可以有两种格式。

最佳答案

无需使用struct 来保存您的数组。 numpy.ndarray 有一个以二进制模式保存自身的便捷方法:ndarray.tofile .以下应该比创建具有与数组相同数量的元素的巨大字符串更有效:

def write_image(im, file_name):
with open(file_name, 'wb') as f:
np.array(im.shape).tofile(f)
im.T.tofile(f)

tofile 总是以行优先的 C 顺序保存,而 MATLAB 使用列优先的 Fortran 顺序。解决这个问题的最简单方法是保存数组的转置。通常,ndarray.T 应该创建一个 View (指向相同底层数据的包装对象)而不是一个副本,因此您的内存使用量不应因此操作而显着增加。

关于python struct.pack 和 write 与 matlab fwrite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42094324/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com