【问题标题】:All vs All dot product全部与全部点积
【发布时间】:2020-05-26 00:02:36
【问题描述】:

我有两个二维 numpy 数组 AB 具有以下维度 (row, cols)

A.shape = (3000, 128)B.shape = (5000, 128)

我希望将 A 的每一行与 B 的每一行取点积。例如;

np.dot(A[0], B[0])
np.dot(A[0], B[1]
np.dot(A[0], B[2]
 .   *  .
 .   *  .  
 .   *  .
np.dot(A[0], B[last]) # last row in B
np.dot(A[1], B[0]) # new row in A
np.dot(A[1], B[1])
np.dot(A[1], B[2])
 .   *  .
 .   *  .  
 .   *  .
np.dot(A[last], B[last]) # last operation

这个操作有特定的名称吗?

现在我有两个 for 循环,我猜这很慢。

all_dots = []
for i in range(0, len(A)):
    for j in range(0, len(B)):
        all_dots.append(np.dot(B[j], A[i]))

我正在寻找线性代数中的本机运算,以更有效地解决这个问题。

提前致谢!

【问题讨论】:

  • 取B的转置矩阵乘积:A @ B.T
  • 您的意思是np.dot(A[0, :], B[0, :]) 等吗?
  • 这是否给出了所有组合?我认为会有更多的 np.dot(A, B.T) ? @担。我想为 A 中的每一行与 B 中的每一行执行点积。所以有很多组合。
  • @Dan A[0,:]A[0] 几乎是一回事。
  • 是的,我刚刚删除了它。对不起,我把自己弄糊涂了。我对做一个简单的矩阵产品的最初反应是正确的。用一个简单的玩具示例自己测试一下。另请注意,您可以使用ravel 来展平结果,但如果您将结果保留为矩阵,则矩阵的位置会告诉您该数字是哪两行的点积。

标签: python arrays numpy linear-algebra


【解决方案1】:

这是一个矩阵产品。第一个矩阵的列数应该等于第二个矩阵的行数

np.dot(A, B.transpose())

这产生了相当于你的代码有两个嵌套循环所做的事情。另一种方法是使用矩阵乘法运算符@.transpose() 的快捷方式.T

A @ B.T

或 numpy 数组的 .dot() 方法

A.dot(B.transpose())

向丹致敬!

【讨论】:

    【解决方案2】:

    你也可以使用臭名昭著的einsum

    np.einsum('ij,kj->ik', a,b)
    

    测试:

    a, b = np.arange(12).reshape(3,4), np.arange(16).reshape(4,4)
    
    np.einsum('ij,kj->ik', a,b)
    

    输出:

    array([[ 14,  38,  62,  86],
           [ 38, 126, 214, 302],
           [ 62, 214, 366, 518]])
    

    如果您想要一维数组,请将其与 .flatten()ravel() 链接:

    np.einsum('ij,kj->ik', a,b).ravel()
    

    输出:

    array([ 14,  38,  62,  86,  38, 126, 214, 302,  62, 214, 366, 518])
    

    【讨论】:

      猜你喜欢
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      相关资源
      最近更新 更多