【问题标题】:Override numpy.matmul function覆盖 numpy.matmul 函数
【发布时间】:2021-08-06 13:58:59
【问题描述】:

我想重写 numpy.matmul() 函数,以便计算这两个向量之间有多少元素按元素相等,而不是两个矩阵向量的点积。

例子:

In [1]: import numpy as np

In [2]: m1 = np.matrix([[1, 2], [3, 4]])

In [3]: m2 = np.matrix([[1, 3], [2, 4]])

In [4]: np.matmul(m1, m2)
Out[4]: 
matrix([[ 5, 11],
        [11, 25]])

我想要以下结果,而不是上面的结果:

In [4]: myfunction(m1, m2)
Out[4]: 
matrix([[2, 0],
        [0, 2]])

[1, 2] 和 [1, 2] 点积5,但我想要 np.sum([1,2] == [1,2]),即2。 我的问题是如何更改两个 v1v2np.matmul() 函数 np.dot() 乘积/strong> 带有 np.sum(v1 == v2)

的向量

【问题讨论】:

  • 我会说重新定义内置方法不是一个好习惯......为什么不直接定义自己并使用 numba 来提高性能?

标签: python numpy matrix overriding linear-algebra


【解决方案1】:
In [93]: m1,m2=np.array([[1,2],[3,4]]),np.array([[1,3],[2,4]])
In [94]: np.matmul(m1,m2)
Out[94]: 
array([[ 5, 11],
       [11, 25]])

点积可以用以下公式计算:

In [95]: (m1[:,:,None]*m2[None,:,:]).sum(axis=1)
Out[95]: 
array([[ 5, 11],
       [11, 25]])

这没有matmul 的速度,因为它不会将任何东西传递给类似 BLAS 的函数,但它仍然相当快,充分利用了numpy 数组操作。

我认为您想要的版本是:

In [96]: (m1[:,:,None]==m2[None,:,:]).sum(axis=1)
Out[96]: 
array([[2, 0],
       [0, 2]])

【讨论】:

  • 我不会给出更好的答案
猜你喜欢
  • 2010-10-25
  • 2010-10-30
  • 2015-03-12
  • 2011-05-31
  • 1970-01-01
  • 2020-11-24
  • 2011-11-14
  • 1970-01-01
相关资源
最近更新 更多