我正在尝试使用 Scipy Radial Basis Function (Rbf) 插入一个表示 2D 表面的不太大(~10.000 个样本)的点云。我得到了一些不错的结果,但是在我最后的数据集上,我一直得到MemoryError
,即使错误在执行过程中几乎立即出现(RAM 显然没有被吃掉)。
我决定rbf.py
从 Scipy 破解文件的副本,首先用一些打印语句填充它,这些语句非常有用。_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, y1], [x2, y2], [x3, y3], ..., [xn, yn]] 和 X2 的形式调用数组 X1,它是 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 中绘制它,并且浊点在视觉上形成得非常好。
任何帮助将不胜感激。
谢谢阅读。