【问题标题】:Adding up all pairs of columns of two matrices将两个矩阵的所有列对相加
【发布时间】:2014-11-18 12:38:15
【问题描述】:

我有两个矩阵 A 和 B,它们的列数相等,但行数通常不相等。我想将矩阵 A 和 B 中的所有列对相加。带有 for 循环的简单实现是这样的:

import numpy as np
ncol = 3
nrow_A = 5
nrow_B = 10
A = np.ones((nrow_A,ncol))
B = np.zeros((nrow_B,ncol))

C = np.empty((nrow_A*nrow_B,ncol))
k = 0
for i in range(nrow_A):
    for j in range(nrow_B):
        C[k,:] = A[i,:]+B[j,:] 
        k += 1

在本例中返回一个 50*3 的矩阵,其中填充了 1。感觉这应该可以用一行代码来实现。我怎样才能做到这一点?

【问题讨论】:

    标签: python numpy matrix combinations addition


    【解决方案1】:

    如果你稍微重塑A,你可以将两个矩阵加在一起,并连接结果数组第一个轴上的条目:

    >>> np.concatenate(A[:,np.newaxis,:] + B)
    array([[ 1.,  1.,  1.],
           [ 1.,  1.,  1.],
           [ 1.,  1.,  1.],
           [ 1.,  1.,  1.],
           [ 1.,  1.,  1.],
           [ 1.,  1.,  1.],
           [ 1.,  1.,  1.],
           ...
    

    concatenate 的一个稍快的替代方法是使用reshape

    (A[:,np.newaxis,:] + B).reshape(-1, 3)
    

    【讨论】:

    • 谢谢。连接不是一个相当昂贵的操作吗?
    • @Forzaa - 没错,它可以;您可以改用reshape(我已将其添加到答案中)
    • 太棒了!真正方便地使用 numpy 函数。目前我还没有足够的经验来看到所有的可能性,所以看到这些例子真的很好。
    【解决方案2】:

    这并不漂亮,但这条线使用广播来做同样的事情:

    (A[:, np.newaxis, :] + B[np.newaxis, :, :]).reshape(nrow_A * nrow_B, ncol)
    

    例子

    import numpy as np
    ncol = 3
    nrow_A = 5
    nrow_B = 10
    A = np.random.random_sample((nrow_A,ncol))
    B = np.random.random_sample((nrow_B,ncol))
    
    C = np.empty((nrow_A*nrow_B,ncol))
    k = 0
    for i in range(nrow_A):
        for j in range(nrow_B):
            C[k,:] = A[i,:]+B[j,:] 
            k += 1
    
    D = (A[:, np.newaxis, :] + B[np.newaxis, :, :]).reshape(nrow_A * nrow_B, ncol)
    
    print(np.allclose(C, D))
    

    【讨论】:

    • 泰。您给出的答案与 Ajcr 几乎相同,但由于他的版本还包含一个替代方案,因此我接受了那个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 2021-02-27
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多