Numpy,三维数组的所有配对相关性

2 投票
2 回答
1187 浏览
提问于 2025-04-17 03:52

我有一个形状为 (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

有什么想法吗?

  1. 首先,你要明白,如果 m 和 n 不相等,就无法计算这样的距离。
  2. 其次,pdist 里面的循环如果是用 C 语言写的,那就不需要担心,因为问题可能不在于代码的实现,而是在于需要进行的计算量。
  3. 最后,你的问题可能可以通过 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扩展。

撰写回答