每当您有乘法和和时,请尝试使用点积函数或之一
np.einsum。由于要预分配数组,而不是为水平和垂直坐标使用不同的数组,因此将它们堆叠在一起:
precomputed_flat = np.column_stack((svf.flatten(), shf.flatten()))measured_flat = np.column_stack((VVmeasured.flatten(), HHmeasured.flatten()))deltas = precomputed_flat - measured_flat[:, None, :]
从这里开始,最简单的方法是:
dist = np.einsum('ijk,ijk->ij', deltas, deltas)
您也可以尝试以下方法:
from numpy.core.umath_tests import inner1ddist = inner1d(deltas, deltas)
当然也有SciPy的空间模块
cdist:
from scipy.spatial.distance import cdistdist = cdist(precomputed_flat, measured_flat, 'euclidean')
编辑 我无法在如此大的数据集上运行测试,但是这些时间颇具启发性:
len_a, len_b = 10000, 1000a = np.random.rand(2, len_a)b = np.random.rand(2, len_b)c = np.random.rand(len_a, 2)d = np.random.rand(len_b, 2)In [3]: %timeit a[:, None, :] - b[..., None]10 loops, best of 3: 76.7 ms per loopIn [4]: %timeit c[:, None, :] - d1 loops, best of 3: 221 ms per loop
对于上述较小的数据集,通过在内存中以不同的方式排列数据,我可以稍微加快使用
scipy.spatial.distance.cdist和匹配方法的速度
inner1d:
precomputed_flat = np.vstack((svf.flatten(), shf.flatten()))measured_flat = np.vstack((VVmeasured.flatten(), HHmeasured.flatten()))deltas = precomputed_flat[:, None, :] - measured_flatimport scipy.spatial.distance as spdistfrom numpy.core.umath_tests import inner1dIn [13]: %timeit r0 = a[0, None, :] - b[0, :, None]; r1 = a[1, None, :] - b[1, :, None]; r0 *= r0; r1 *= r1; r0 += r110 loops, best of 3: 146 ms per loopIn [14]: %timeit deltas = (a[:, None, :] - b[..., None]).T; inner1d(deltas, deltas)10 loops, best of 3: 145 ms per loopIn [15]: %timeit spdist.cdist(a.T, b.T)10 loops, best of 3: 124 ms per loopIn [16]: %timeit deltas = a[:, None, :] - b[..., None]; np.einsum('ijk,ijk->jk', deltas, deltas)10 loops, best of 3: 163 ms per loop
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)