Python 稀疏矩阵 C,其元素 c_ij = sum_j min(a_ij, b_ji) 来自稀疏矩阵 A 和 B

问题描述 投票:0回答:1

我有两个稀疏矩阵 AB,其中 AB 具有相同的列数(但行数可能不同)。我正在尝试获得一个稀疏矩阵 C,其元素为 c_ij = sum_j min(a_ij,b_ji),其中 a_ij 和 b_ij 分别是 AB 的元素。

这可以有效地完成吗?理想情况下是稀疏的吗?即使密集也可以,但涉及的矩阵将是巨大的(数万行)并且非常稀疏。

详情: 类比是标准(数学)矩阵乘法,但我不想对元素的乘积求和,而是对元素的最小值求和。

一个例子会有所帮助。使用标准矩阵乘法 A * B^T 给出元素 c_ij = sum_j a_ij * b_ji for elements a_ij in A and b_ij in B with i and j as row and column indices, respectively.

例如,

import numpy as np
from scipy.sparse import csr_matrix

A = csr_matrix([[1, 2, 0], [0, 0, 3], [4, 0, 5]])
B = csr_matrix([[2, 0, 0], [0, 0, 3], [6, 0, 0]])
BT = B.transpose()

C= A * BT
print(f"\nC = A * B^T = \n{C}")

给予

>>> 
C = A * B^T = 
  (0, 2)    6
  (0, 0)    2
  (1, 1)    9
  (2, 1)    15
  (2, 2)    24
  (2, 0)    8

在哪里

c_33 = 24 = sum_j ( a_3j * b_j3 ) = 4 * 6 + 0 * 0 + 5 * 0.

我想要最小值的总和,而不是乘积 a_ij * b_ji 的总和:

c_33 = sum_j min(a_ij,b_ji) = min(4,6) + min(0,0) + min(0,5) = 4.

python numpy scipy sparse-matrix matrix-multiplication
1个回答
0
投票

在普通的密集数组中,使用三维数组可以更轻松地完成此操作,但稀疏形式不可用。相反,

import scipy.sparse
from scipy.sparse import csr_matrix

A = csr_matrix([
    [1, 2, 7],
    [5, 0, 3],
    [4, 0, 5],
])
B = csr_matrix([
    [2, 7, 0],
    [4, 0, 3],
    [6, 0, 0],
])
ABT = scipy.sparse.vstack((
    A.reshape((1, -1)),
    B.T.reshape((1, -1))
))
mins = ABT.min(axis=0).reshape(A.shape)
C = mins.sum(axis=1)
print("C = Σ(min(A, B^T)) =")
print(C)
C = Σ(min(A, B^T) =
[[9]
 [5]
 [0]]
© www.soinside.com 2019 - 2024. All rights reserved.