【问题标题】:Numpy: Dot product with max instead of sumNumpy:点积与最大值而不是总和
【发布时间】:2016-12-15 12:34:02
【问题描述】:

在 numpy 中有没有办法执行以下操作(或者是否有一个通用的数学术语):

假设正常点积:

M3[i,k] = sum_j(M1[i,j] * M2[j,k])

现在我想用 sum 其他运算替换 sum,比如最大值:

M3[i,k] = max_j(M1[i,j] * M2[j,k])

如您所见,它与上述完全平行,只是我们将max 放在所有j 上,而不是总和。

其他选项可以是minprod,以及将序列/集合转换为值的任何其他操作。

【问题讨论】:

  • 出于好奇:有谁知道这种概括是否有一个特殊的数学术语?也许这个问题已经在优化方面进行了研究......
  • dotsum of products 操作。有一个issue 请求泛化np.einsum,这将让用户指定这两个操作。在艾弗森的APL中,内积写成A+.×B,可以用其他运算符代替+x

标签: python numpy max sequence dot-product


【解决方案1】:

正常的点积是(使用 numpy 广播)

M3 = np.sum(M1[:, :, None] * M2[None, :, :], axis = 1)

您可以对任何具有axis 关键字的函数执行相同的操作。

M3 = np.max(M1[:, :, None] * M2[None, :, :], axis = 1)

【讨论】:

  • 或者简单地说:np.max(M1[...,None]*M2,axis=1) 等等。
  • 第一行代码会不会比np.dot(M1,M2)慢很多?
  • @RadioControlled np.dot 是一种特殊情况,AFAIK 不进行元素乘法和求和,所以是的 np.dot 会快得多。
  • 可能比 np.dot 慢,因为它是在 c 代码中优化和实现的。
  • 不,但这可能是你最好的选择,因为稀疏矩阵不能正常广播。该答案建议使用np.take 创建一个稀疏广播实现,这应该是有效的,但对于nD 来说它几乎不是一个完整的答案。您可能想问另一个与此相关的问题,这可能会让一些更有经验的人(如上面的 Divakar)给出他们的看法
猜你喜欢
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多