牵着气球的路人 2022-04-03 17:02 采纳率: 100%
浏览 73
已结题

求两个矩阵所有行向量之间的欧氏距离

假设有两个矩阵行数不同,维度相同,如A.shape = (500,300),B.shape = (200000,300),希望求出所有行向量之间的曼哈顿距离,输出一个矩阵M,Mij表示A中第i个行向量与B中第j个行向量的曼哈顿距离,M.shape=(500,200000)。我想到使用双循环
import numpy as np

def Manhadun(x,y):
return np.sum(np.abs(x-y))

def ManhadunMatrix(x,y):
M = np.empty((x.shape[0],y.shape[0]))
for i in range(x.shape[0]):
for j in range(y.shape[0]):
M[i][j] = Manhadun(x[i],y[j])
return M
但是双循环的速度太慢了,请问有没有更快的方法呢?直接对矩阵操作应该更快,但是没有思路。希望有人帮忙

  • 写回答

1条回答 默认 最新

  • ash062 2022-04-04 00:37
    关注

    改进了一下,应该会快一点,但测试了下也要4min多

    import numpy as np
    import time
    
    def Manhadun(x,y):
        return np.sum(np.abs(x-y))
    
    def ManhadunMatrix(x,y):
        M = np.empty((x.shape[0],y.shape[0]))
        for i in range(x.shape[0]):
            for j in range(y.shape[0]):
                M[i][j] = Manhadun(x[i],y[j])
        return M
    
    def ManhadunMatrix_(x, y):
        return np.array([np.sum(np.abs(x[i, :] - y), axis = 1) for i in range(x.shape[0])])
    
    if __name__ == '__main__':
        A = np.random.randn(500, 300)
        B = np.random.randn(200000, 300)
        
        start = time.time()
    
        M1 = ManhadunMatrix_(A, B)
    
        print(time.time() - start)  # 259.9257025718689
    
    本回答被专家选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月14日
  • 专家已采纳回答 4月6日
  • 创建了问题 4月3日

悬赏问题

  • ¥15 目详情-五一模拟赛详情页
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line