Python 无for循环的平方行差的numpy行对和(仅api调用)

Python 无for循环的平方行差的numpy行对和(仅api调用),python,numpy,matrix,multidimensional-array,Python,Numpy,Matrix,Multidimensional Array,对于那些能够阅读Latex的人,这就是我试图计算的: $$k{xyi}=\sum{j}\left(\left(x{i}-x{j}\right)^{2}+\left(y{i}-y{j}\right)^{2}\right)$$ 其中x和y是矩阵a的行 仅对于计算机语言,这将翻译为: k(x,y,i)=和(xi-xj)^2+(yi-yj)^2) 其中x和y是矩阵a的行 所以k是一个三维矩阵 这只能通过API调用实现吗?(循环编号) 以下是测试启动: import numpy as np A = np.

对于那些能够阅读Latex的人,这就是我试图计算的:

$$k{xyi}=\sum{j}\left(\left(x{i}-x{j}\right)^{2}+\left(y{i}-y{j}\right)^{2}\right)$$

其中x和y是矩阵a的行

仅对于计算机语言,这将翻译为: k(x,y,i)=和(xi-xj)^2+(yi-yj)^2) 其中x和y是矩阵a的行

所以k是一个三维矩阵

这只能通过API调用实现吗?(循环编号)

以下是测试启动:

import numpy as np
A = np.random.rand(4,4)
k = np.empty((4,4,4))
for ix in range(4):
    for iy in range(4):
        x = A[ix,]
        y = A[iy,]
        sx = np.power(x - x[:,np.newaxis],2)
        sy = np.power(y - y[:,np.newaxis],2)
        k[ix,iy] = (sx + sy).sum(axis=1).T
现在对于主编码器,请用numpyapi调用替换两个for循环

更新:
忘了提到我需要一种节省RAM空间的方法,我的a矩阵通常是2-3万平方。因此,如果您的答案不创建巨大的临时多维数组,那就太好了。

我将更改您的latex,使其看起来更像以下内容-在我看来,它更容易混淆:

由此,我假设表达式中的最后一行应该是:

k[ix,iy] = (sx + sy).sum(axis=-1)
如果是,您可以按如下方式计算上述表达式:

Axij = (A[:, None, :] - A[..., None])**2
k = np.sum(Axij[:, None, :, :] + Axij, axis=-1)
以上内容首先扩展了内存密集型4D阵列。如果您担心内存问题,可以通过引入新的for循环跳过此步骤:

k = np.empty((4,4,4))
Axij = (A[:, None, :] - A[..., None])**2
for xi in range(A.shape[0]):
    k[xi] = np.sum(Axij[xi, None, :, :] + Axij, axis=-1)
这会更慢,但不会像你们想象的那个么多,因为你们仍然在numpy中做很多操作。您可能会跳过3D
Axij
中间版本,但这样做会导致性能下降


如果你的矩阵在一条边上真的是20k,你的3D输出将是64TB。你不会在numpy甚至内存中这样做(除非你有一个大规模的分布式内存系统)。

哦,伙计,你所做的是正确和酷的,你有我的投票权,但是你在那里创建了很多矩阵,我需要节省一些ram。我的A矩阵“仅”为20K^2。对不起,我将用这个额外的部分更新我的问题。精彩的解决方案!我更新了一个使用4D中间层的算法问题;但是,您不会在边缘上有一个20k的3D输出并将其存储在内存中。是的,我希望分批完成最后一个维度i,稍后我会检查您的更新,谢谢!