Numpy,三维数组的所有配对相关性
我有一个形状为 (l,m,n) 的数组。我想计算一个形状也是 (l,m,n) 的距离矩阵,其中第 (i,j,k) 个位置的值是向量 (i,j,:) 和 (i,:,k) 之间的系数。我在 numpy 或 scipy 中没有找到合适的方法。
我尝试过使用 for 循环沿着第 0 轴进行迭代,然后把结果传给 scipy.spatial.distance.pdist,但这样做很慢,因为 pdist 本身也使用了嵌套的 for 循环。简单来说,我想在第 0 轴上执行 pdist,但理想情况下希望 pdist 也不使用 for 循环……
有什么想法吗?
2 个回答
0
有什么想法吗?
- 首先,你要明白,如果 m 和 n 不相等,就无法计算这样的距离。
- 其次,
pdist
里面的循环如果是用 C 语言写的,那就不需要担心,因为问题可能不在于代码的实现,而是在于需要进行的计算量。 - 最后,你的问题可能可以通过 numpy.einsum 和线性代数来解决。
代码(我认为这是最优的):
products = numpy.einsum('ijl, ilk -> ijk')
distances = numpy.einsum('ijj -> ij', products)
distances = distances[:, :, None] + distances[:, None, :] - 2 * product
3
我个人会写一个小的Cython函数来完成这个任务(http://cython.org)。首先,你可以用纯Python写一个简单的版本,使用for循环来实现,然后把它移到一个.pyx的Cython文件里,添加一些类型声明,并按照NumPy的集成指南进行操作:
http://docs.cython.org/src/tutorial/numpy.html
这看起来可能有点麻烦,但如果你在用Python进行计算,掌握一些基本的Cython技能是非常值得的,因为这样可以让你更轻松地编写C扩展。