【发布时间】:2019-10-28 20:28:52
【问题描述】:
我在 python 64 位上处理非常大的数据集,需要一些帮助来优化我的插值代码。
我习惯于使用 numpy 来避免循环,但这里有 2 个循环我找不到避免的方法。
主要问题还在于,当我使用 numpy 时,我需要计算的数组的大小会产生内存错误,所以我切换到 scipy 稀疏数组,它可以工作,但需要太多时间来计算 2 个左循环......
我尝试使用 numpy.fromfunction 迭代地构建我的矩阵,但它不会运行,因为数组的大小太大。
我已经阅读了很多关于构建大型数组的帖子,但与我必须构建的相比,所询问的数组过于简单,因此解决方案在这里不起作用。
我无法减小数据集的大小,因为它是一个点云,我已经平铺了 10x10 的平铺。
这是我的插值代码:
z_int = ss.dok_matrix((x_int.shape))
n,p = x_obs.shape
m = y_obs.shape[0]
a1 = ss.coo_matrix( (n, 3), dtype=np.int64 )
a2 = ss.coo_matrix( (3, 3), dtype=np.int64 )
a3 = ss.dok_matrix( (n, m))
a4 = ss.coo_matrix( (3, n), dtype=np.int64)
b = ss.vstack((z_obs, ss.coo_matrix( (3, 1), dtype=np.int64 ))).tocoo()
a1 = ss.hstack((ss.coo_matrix(np.ones((n,p))), ss.coo_matrix(x_obs), ss.coo_matrix(y_obs)))
shape_a3 = a3.shape[0]
for l in np.arange(0, shape_a3):
for c in np.arange(0, shape_a3) :
if l == c:
a3[l, c] = rho
else:
a3[l, c] = phi(x_obs[l] - x_obs[c], y_obs[l] - y_obs[c])
a4 = a1.transpose()
a12 = ss.vstack((a1, a2))
a34 = ss.vstack((a3, a4))
a = ss.hstack((a12, a34)).tocoo()
x = spsolve(a, b)
for i in np.arange(0, z_int.shape[0]):
for j in np.arange(0, z_int.shape[0]):
z_int[i, j] = x[0] + x[1] * x_int[i, j] + x[2] * y_int[i, j] + np.sum(x[3:] * phi(x_int[i, j] - x_obs, y_int[i, j] - y_obs).T)
return z_int.todense()
其中 dist() 是一个计算距离的函数,而 phi 如下:
return dist(dx, dy) ** 2 * np.log(dist(dx, dy))
我需要代码运行得更快,我知道它可能写得很糟糕,但我想学习如何编写更优化的代码来提高我的编码技能。
【问题讨论】:
-
另一种选择是继续使用完整的数组,但使用内存映射,因此它们不必适合 ram。
-
我去试试,谢谢!
标签: python numpy optimization scipy large-data