Numpy根据矩阵中的所有行计算矩阵的差

2024-09-29 22:16:14 发布

您现在位置:Python中文网/ 问答频道 /正文

给定两个矩阵,我想创建一个每行差平方和的新数组,但我似乎找不到方法

为了更清楚我的意思,让我们举个例子。我想对numpy矩阵计算中的循环执行以下操作:

a = np.array([[0.0, 0.0, 0.0], [1.0, 1.0, 1.0]])
b = np.array([[1.2, 2.3, 3.4], [4.5, 5.6, 7.8], [9.10, 10.11, 11.12]])
summed = np.ones((2,3))
for i, aSample in enumerate(a):
    for j, bSample in enumerate(b):
       summed[i, j] = np.sum(np.power(aSample - bSample, 2))

>>>summed
array([[ 18.29  , 112.45  , 308.6765],
       [  7.49  ,  79.65  , 251.0165]])

这些只是示例矩阵,在我的用例中,两个矩阵都有数万行。所以这些矩阵的形状更像(20000,1000)。有没有办法用numpy有效地做到这一点

编辑: @Blorgon提供了正确的结果,但在我的例子中,我无法使用np.newaxis分配更大的矩阵。一位@mad物理学家的解决方案成功地计算了内存限制内的向量距离


Tags: 方法innumpyfornpones矩阵数组
2条回答

blorgon建议的numpy解决方案可能更快,但您也可以使用^{}

>>> from scipy.spatial.distance import cdist
>>> cdist(a, b)**2
array([[ 18.29  , 112.45  , 308.6765],
       [  7.49  ,  79.65  , 251.0165]])

这种方法的问题是,它取一个平方根,然后将其撤消。优点是它不使用大型中间阵列。您可以避免numpy中的某些中间产物,如下所示:

>>> diff = b - a[:, np.newaxis]
>>> np.power(diff, 2, out=diff).sum(axis=2)
array([[ 18.29  , 112.45  , 308.6765],
       [  7.49  ,  79.65  , 251.0165]])

您可以使用np.newaxis来实现所需的结果:

>>> np.sum(np.power(b - a[:, np.newaxis], 2), axis=2)
array([[ 18.29  , 112.45  , 308.6765],
       [  7.49  ,  79.65  , 251.0165]])

编辑:虽然我的解决方案更快,但如果内存很重要,那么scipy解决方案更好

相关问题 更多 >

    热门问题