Scipy径向基函数(scipy.interpolate.rbf)中的Python MemoryError

标签 python memory numpy scipy interpolation

我正在尝试使用 Scipy 径向基函数 (Rbf) 插入一个表示 2D 表面的不太大(约 10.000 个样本)的点云。我得到了一些不错的结果,但是对于我最后的数据集,我一直得到 MemoryError,即使错误在执行过程中几乎立即出现(RAM 显然没有被吃掉)。

我决定从 Scipy 破解 rbf.py 文件的副本,首先在其中填充一些非常有用的打印语句。通过逐行分解 _euclidean_norm 方法,如下所示:

def _euclidean_norm(self, x1, x2):
    d = x1 - x2
    s = d**2
    su = s.sum(axis=0)
    sq = sqrt(su)
    return sq

我在第一行得到错误:

File "C:\MyRBF.py", line 68, in _euclidean_norm
    d = x1 - x2
MemoryError

该范数在数组 X1 上调用,格式为 [[x1, y1], [x2, y2], [x3, y3], ..., [xn, yn]] 和 X2,即 X1由 Rbf 类中的以下方法转置,已被我出于调试目的破解:

def _call_norm(self, x1, x2):
    print x1.shape
    print x2.shape
    print

    if len(x1.shape) == 1:
        x1 = x1[newaxis, :]
    if len(x2.shape) == 1:
        x2 = x2[newaxis, :]
    x1 = x1[..., :, newaxis]
    x2 = x2[..., newaxis, :]

    print x1.shape
    print x2.shape
    print

    return self._euclidean_norm(x1, x2)

请注意我打印了输入的形状。使用我当前的数据集,这就是我得到的(我手动添加了评论):

(2, 10744)         ## Input array of 10744 x,y pairs
(2, 10744)         ## The same array, which is to be "reshaped/transposed"

(2, 10744, 1)      ## The first "reshaped/transposed" form of the array
(2, 1, 10744)      ## The second "reshaped/transposed" form of the array

根据文档,基本原理是获得“从 x1 中的每个点到 x2 中的每个点的距离矩阵”,这意味着,由于数组是相同的,因此每对之间的距离矩阵入口数组(包含 X 和 Y 维度)。

我用小得多的数组(例如形状 (2,5,1) 和 (2,1,5))手动测试了操作,并且减法有效。

我怎样才能找出为什么它不适用于我的数据集?还有其他明显的错误吗?我应该检查我的数据集的某种形式的病态,还是对其进行一些预处理?我认为它的条件很好,因为我可以在 3D 中绘制它,并且浊点在视觉上形成得非常好。

非常感谢任何帮助。

感谢阅读。

最佳答案

您的数据集应该没问题:出现错误是因为您没有足够的 RAM 来存储减法结果。

根据广播规则,结果会有形状

 (2, 10744,     1)
-(2,     1, 10744)
------------------
 (2, 10744, 10744)

假设这些是 dtype float64 的数组,您需要 2*10744**2*8 = 1.72 GiB 的可用内存。如果没有足够的可用内存,numpy 将无法分配输出数组,并会立即失败并显示您看到的错误。

关于Scipy径向基函数(scipy.interpolate.rbf)中的Python MemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11865378/

相关文章:

python - 将 Pandas 数据框中的整数二值化

python - 将元素插入到 numpy 数组的开头和结尾

python - 如何暂停 Python 脚本并让用户在 Linux 终端中输入

python - Python 的随机森林距离无法构建 (g++)

python - bash/ python : Organization of several scripts

python - 查找列的第一个值并分配给单独的列 pandas

memory - OpenCL 何时使用全局、私有(private)、本地、常量地址空间

c - 我在 c 中的 realloc() 做错了什么?

C 内存管理与 int 指针(数组)?

python - 使用 Python 进行反距离加权 (IDW) 插值