【问题标题】:Elementwise mean of dot product in Python (numpy)Python中点积的元素平均值(numpy)
【发布时间】:2012-11-22 20:21:59
【问题描述】:

我有两个 numpy 矩阵(或稀疏等价物),例如:

>>> A = numpy.array([[1,0,2],[3,0,0],[4,5,0],[0,2,2]])
>>> A
array([[1, 0, 2],
       [3, 0, 0],
       [4, 5, 0],
       [0, 2, 2]])
>>> B = numpy.array([[2,3],[3,4],[5,0]])
>>> B
array([[2, 3],
       [3, 4],
       [5, 0]])

>>> C = mean_dot_product(A, B)
>>> C
array([[6   ,  3],
       [6   ,  9],
       [11.5, 16],
       [8   ,  8]])

在哪里C[i, j] = sum(A[i,k] * B[k,j]) / count_nonzero(A[i,k] * B[k,j])

在 numpy 中有一种快速执行此操作的方法吗?

一个非理想的解决方案是:

>>> maskA = A > 0
>>> maskB = B > 0

>>> maskA.dtype=numpy.uint8
>>> maskB.dtype=numpy.uint8

>>> D = replace_zeros_with_ones(numpy.dot(maskA,maskB)) 

>>> C = numpy.dot(A,B) / D

谁有更好的算法?

此外,如果 A 或 B 是稀疏矩阵,使它们变得密集(用 1 替换 0)会使内存占用爆炸!

【问题讨论】:

    标签: python numpy scipy


    【解决方案1】:

    为什么需要replace_zeros_with_ones?我删除这一行并运行您的代码并得到正确的结果。

    如果所有数字都不是负数,则只需一行即可:

    np.dot(A, B)/np.dot(np.sign(A), np.sign(B))
    

    【讨论】:

    • numpy.sign 默认生成有符号的int64 数组(带0、+1、-1),要使用该函数获得相同的结果,您应该使用numpy.sign(A, dtype = numpy.uint8)。然后你必须用一替换零以避免0/0(在我的例子中np.dot(np.sign(A), np.sign(B))中没有零)
    猜你喜欢
    • 2016-09-23
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 2015-10-08
    • 2015-07-15
    相关资源
    最近更新 更多