Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.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 如何在块中加载非常大的mat文件?_Python_Matlab_Numpy_Out Of Memory_Image Preprocessing - Fatal编程技术网

Python 如何在块中加载非常大的mat文件?

Python 如何在块中加载非常大的mat文件?,python,matlab,numpy,out-of-memory,image-preprocessing,Python,Matlab,Numpy,Out Of Memory,Image Preprocessing,好的,代码是这样的 X1是加载的高光谱图像,尺寸为(512x512x91) 我试图做的基本上是裁剪64x64x91大小的矩阵,改变步长为2。这给了我总共49952个图像,每个图像的大小为64x64x91,但是当我运行for循环时,我得到了内存错误。 我的系统有8GB内存 data_images_0=np.zeros((49952,256,256,91)) k=0 for i in range(0,512-64,2): r=64 print(k) for j in rang

好的,代码是这样的 X1是加载的高光谱图像,尺寸为(512x512x91) 我试图做的基本上是裁剪64x64x91大小的矩阵,改变步长为2。这给了我总共49952个图像,每个图像的大小为64x64x91,但是当我运行for循环时,我得到了内存错误。 我的系统有8GB内存

data_images_0=np.zeros((49952,256,256,91))
k=0
for i in range(0,512-64,2):
    r=64
    print(k)
    for j in range (0,512-64,2):   
        #print(k)
        data_images_0[k,:,:,:]=X1[i:i+r,j:j+r,:]
        k=k+1
我有一个高光谱图像作为Mat文件加载,尺寸为(512x512x91)。我想使用这个图像的块作为CNN的输入,例如使用64x64x91的作物。问题是,一旦我从原始图像中创建了作物,我就无法加载数据,因为一次加载所有作物会导致内存错误。 我可以做些什么来批量加载我的裁剪数据,这样我就不会收到这样的内存错误。 我应该将数据转换成其他格式还是以其他方式处理问题?

您正在寻找函数。它允许您访问硬盘上的阵列,然后仅加载部分阵列

假设您的图片名为
pic
,那么您可以执行以下操作

data = matfile("filename.mat");
part = data.pic(1:64,1:64,:);

%Do something
然后只有变量
pic
(1:64,1:64,:)
部分将加载到
部分中

应该注意的是,在硬盘上工作并不是很快,应该避免。另一方面,如果您的变量太大,无法放入内存,那么除了购买更多内存之外,没有其他方法可以解决此问题。

您正在寻找函数。它允许您访问硬盘上的阵列,然后仅加载部分阵列

假设您的图片名为
pic
,那么您可以执行以下操作

data = matfile("filename.mat");
part = data.pic(1:64,1:64,:);

%Do something
然后只有变量
pic
(1:64,1:64,:)
部分将加载到
部分中


应该注意的是,在硬盘上工作并不是很快,应该避免。另一方面,如果您的变量太大,无法放入内存,那么除了购买更多内存之外,没有其他方法可以解决此问题。

我认为您可能需要使用
matfile
函数,它基本上可以打开一个.mat文件,而无需将其全部内容拉入RAM。基本上是从.mat文件中读取一个头文件,其中包含有关存储元素的信息,如大小、数据类型等。想象一下,您的.mat文件hyperspectralimg.mat包含矩阵myImage。你必须这样做:

filename = 'hyperspectralimg.mat';
img = matfile(filename);

A = doStuff2MyImg(img.myImage(1:64,1:64,:)); % Do stuff to your imageparts

img.myImage(1:64,1:64,:) = A; %Return changes to your file
这是一个简单的例子,如果您以前没有使用过
matfile
,您可以如何使用它。如果您已经使用过它,但它不起作用,请告诉我们,作为一般性建议,请上传有关您的问题的代码片段和数据示例,这会有所帮助


关于标记的快速评论:如果您关心的是
matlab
,那么不要标记
python
和类似的东西。

我认为您可能希望使用
matfile
函数,它基本上打开一个.mat文件,而不将其全部内容拉入RAM。基本上是从.mat文件中读取一个头文件,其中包含有关存储元素的信息,如大小、数据类型等。想象一下,您的.mat文件hyperspectralimg.mat包含矩阵myImage。你必须这样做:

filename = 'hyperspectralimg.mat';
img = matfile(filename);

A = doStuff2MyImg(img.myImage(1:64,1:64,:)); % Do stuff to your imageparts

img.myImage(1:64,1:64,:) = A; %Return changes to your file
这是一个简单的例子,如果您以前没有使用过
matfile
,您可以如何使用它。如果您已经使用过它,但它不起作用,请告诉我们,作为一般性建议,请上传有关您的问题的代码片段和数据示例,这会有所帮助


关于标记的快速评论:如果您关心的是
matlab
,那么不要标记
python
和类似的东西。

您可以使用numpy内存映射。这相当于MatLAB的matfile


您可以使用numpy内存映射。这相当于MatLAB的matfile


您的图像是简单地存储为矩阵还是某种图像格式?欢迎使用。请提供一个最小、完整且可验证的示例。向我们展示您最近一次尝试的代码以及您被卡住的地方。并解释为什么结果不是你所期望的。编辑您的问题以包含代码,请不要将其添加到注释中,因为它可能无法阅读。是的,它存储为矩阵。基本上,512x512是空间维度,91是通道或深度…所有这些都只是每个像素值的矩阵。mat文件(v7.3)的最新格式是压缩的,因此除了全部解压缩外,没有太多选择。此外,数据以列主顺序存储,因此64x64x91阵列的样本将分布在整个512x512x91卷中。现在,高光谱图像只包含大约2250万像素:它应该很容易放入内存中。请包括如何生成作物的示例代码。这是相关的,因为它可能解释了内存不足的原因,说明了如何存储作物,并给出了如何将作物放入文件以便于访问的想法。您的图像是简单地存储为矩阵还是某种图像格式?欢迎使用。请提供一个最小、完整且可验证的示例。向我们展示您最近一次尝试的代码以及您被卡住的地方。并解释为什么结果不是你所期望的。编辑您的问题以包含代码,请不要将其添加到注释中,因为它可能无法阅读。是的,它存储为矩阵。基本上,512x512是空间维度,91是通道或深度…所有这些都只是每个像素值的矩阵。mat文件(v7.3)的最新格式是压缩的,因此除了全部解压缩外,没有太多选择。此外,数据以列主顺序存储,因此64x64x91阵列的样本将分布在整个512x512x91卷中。现在,高光谱图像只包含大约2250万像素:它应该很容易放入内存中。请包括如何生成作物的示例代码。这是相关的,因为它可以解释为什么你的内存不足,展示你如何储存作物,并给出如何储存的想法