Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.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_Python 3.x_Numpy_Matrix_Large Data - Fatal编程技术网

Python 如何分割成块(子矩阵),或者处理一个巨大的矩阵,在numpy上给出内存错误?

Python 如何分割成块(子矩阵),或者处理一个巨大的矩阵,在numpy上给出内存错误?,python,python-3.x,numpy,matrix,large-data,Python,Python 3.x,Numpy,Matrix,Large Data,我有一个非常大的矩阵,不能简单地放入内存。我必须使用的矩阵有483798149136元素,这意味着有4830亿个浮点数 我所考虑的方法是,以某种方式将这个巨大的矩阵拆分成适合内存的不同子矩阵,对这些子矩阵执行操作,然后将它们全部合并回来,重建原始矩阵,希望在所有池操作之后能够适合内存 如果我错了,请纠正我,这个方法只是我想出的一个主意,它是好是坏,我不知道。如果你有更好的选择,我愿意接受任何建议 重现该矩阵的代码为: a = np.arange(695556).reshape(834,834)

我有一个非常大的矩阵,不能简单地放入内存。我必须使用的矩阵有
483798149136
元素,这意味着有4830亿个浮点数

我所考虑的方法是,以某种方式将这个巨大的矩阵拆分成适合内存的不同子矩阵,对这些子矩阵执行操作,然后将它们全部合并回来,重建原始矩阵,希望在所有池操作之后能够适合内存

如果我错了,请纠正我,这个方法只是我想出的一个主意,它是好是坏,我不知道。如果你有更好的选择,我愿意接受任何建议

重现该矩阵的代码为:

a = np.arange(695556).reshape(834,834)
np.meshgrid(a,a)
我在同一个网站上读了一篇又一篇的文章,但没有一篇能真正解决这类问题,他们只是给出了模糊的建议

我现在的问题是:

  • 我的拆分和池化方法可行吗?或者还有其他更好的方法吗

  • 我如何(从代码的角度)将这个矩阵分割成若干部分(如windows或多维内核),并在以后重新构建它

  • 是否有某种方法可以在numpy中对矩阵进行分块处理,以使用矩阵latyer执行乘法、加法等操作

  • Python中是否有一个特定的包可以帮助处理此类矩阵问题

  • 编辑

    由于一些用户询问我整个操作的目标,我将提供一些信息:

    我在做一个3d打印项目。在这个过程中,激光束熔化金属粉末,制造出复杂的金属片。在这件作品中有很多层,激光一层一层地熔化金属

    我有3个csv文件,每个文件包含一个834 x 834的矩阵。第一个矩阵包含激光束穿过粉末层并熔化金属时X轴的坐标值,第二个矩阵与Y轴相同,第三个矩阵表示激光在同一像素点熔化的时间。这些值以秒为单位表示

    我有激光穿过X轴和Y轴的坐标,以及熔化每个点所需的时间

    该矩阵来自于每个制造件的截面图像

    问题是,当激光到达某个像素时,某个像素的温度和激光停留在该像素的时间可能会对n像素产生影响。所以我想创建一个距离矩阵,它告诉我,在欧几里德距离方面,图像的每个像素彼此之间有多大的不同或相似

    这就是为什么如果我有2 834 x 834个矩阵,我需要创建一个695556 x 695556的矩阵,矩阵中每个点之间的距离。这就是为什么它如此巨大,无法保存在内存中

    我不知道我提供的信息是否太多,或者我的解释是否混乱。你可以问任何你需要的问题我会尽力澄清,但主要的一点是,我需要创建这个巨大的距离矩阵,以了解像素之间的数学距离,然后了解打印时工件某一点上发生的情况与其他点上发生的情况之间的关系,以避免制造缺陷


    事先非常感谢

    毕竟,我找到了解决问题的办法。这个巨大的矩阵可以很容易地使用。Dask是一个python库,它允许分布式计算和数据分块以优化内存使用。它非常方便,因为它确实允许您以真正低的计算和内存成本处理大量数据,显然,它的速度不如内存计算,但我认为很多人都会很高兴知道这一点

    这个软件包经过了很好的优化,经常更新。最好的是它有numpy/pandas sintax,它也可以用与阵列相同的方式处理数据帧,如果你知道pandas/numpy,你会感觉像是在家里和dask在一起

    您可以像这样创建dask分布式阵列:

    import numpy as np
    import dask.array as da
    
    Y = da.random.normal(size=(695556, 695556),
                             chunks=(1000, 1000))
    
    y = Y.mean(axis=0)[0:100].compute()
    
    然后,您可以对其执行如下操作:

    import numpy as np
    import dask.array as da
    
    Y = da.random.normal(size=(695556, 695556),
                             chunks=(1000, 1000))
    
    y = Y.mean(axis=0)[0:100].compute()
    
    此外,如果您使用
    内存分析器
    ,还可以监控内存和CPU使用情况,并查看计算所消耗的大量数据的内存量

    我发现有一些实际的例子很能说明问题

    此外,还可以找到此库中的解释数组范围

    最后,是关于Python3.X中高性能计算的指南


    希望这对解决同样问题的人有所帮助。

    您列出了一些好的选择。对于1,memmapped数组允许有选择地加载部分数据。它们只需很少的修改就可以处理大多数代码。3.“numexpr”与此类似,尽管它旨在提供内存局部性。它不会修复内存不足的错误,但使用memmapped数组可以很好地工作。我将避免太多细节,因为我不知道您试图解决的确切问题。他们都已经足够成熟,可以在网上有很好的文档(memmap是numpy的一部分,它有非常全面的文档),我建议从stackoverflow的一些问题开始,只是为了了解可能的情况()。尽管如果您的最终输出适合内存,memmap阵列可能不是最佳选择。它们会引入相当多的磁盘读取开销。也许了解更多关于您正在使用的算法会有所帮助。有时候NumPy矢量化的方式在内存中可能会变得更昂贵,而Numba加速循环在使用很少内存的情况下可能会非常快。大家好。这个问题更新了关于我的工作和矩阵的额外信息。