Python 无for循环的平方行差的numpy行对和(仅api调用)
对于那些能够阅读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调用实现吗?(循环编号) 以下是测试启动: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.
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中做很多操作。您可能会跳过3DAxij
中间版本,但这样做会导致性能下降
如果你的矩阵在一条边上真的是20k,你的3D输出将是64TB。你不会在numpy甚至内存中这样做(除非你有一个大规模的分布式内存系统)。哦,伙计,你所做的是正确和酷的,你有我的投票权,但是你在那里创建了很多矩阵,我需要节省一些ram。我的A矩阵“仅”为20K^2。对不起,我将用这个额外的部分更新我的问题。精彩的解决方案!我更新了一个使用4D中间层的算法问题;但是,您不会在边缘上有一个20k的3D输出并将其存储在内存中。是的,我希望分批完成最后一个维度i,稍后我会检查您的更新,谢谢!