【发布时间】:2021-12-12 16:11:19
【问题描述】:
我有两个稀疏二进制矩阵 A 和 B 具有匹配的维度,例如A 的形状为 I x J,B 的形状为 J x K。我有一个自定义操作会产生一个形状为I x J x K 的矩阵C,其中每个元素(i,j,k) 是1,只有A(i,j) = 1 and B(j,k) = 1。我目前已经实现了这个操作如下:
import numpy as np
I = 2
J = 3
K = 4
A = np.random.randint(2, size=(I, J))
B = np.random.randint(2, size=(J, K))
# Custom method
C = np.zeros((I,J,K))
for i in range(I):
for j in range(J):
for k in range(K):
if A[i,j] == 1 and B[j,k] == 1:
C[i,j,k] = 1
print(C)
但是,对于大型 I,J,K,for 循环非常慢。是否可以使用 numpy 方法来实现此操作以加快速度?我看过np.multiply.outer,但到目前为止没有成功。
【问题讨论】:
-
你试过 numba 吗?如果矩阵是稀疏的,为什么不使用它们的稀疏表示?应该更快地只遍历包含非零元素的位置
-
@yannziselman 还没有,但我也在考虑。
-
稀疏矩阵通常用于相当大的数组。您确定要生成一个形状为 (I,J,K) 的非稀疏数组 C,而不仅仅是满足条件的索引吗?
-
@max9111 是的,实际上我使用大约 256 的尺寸,但还有更多的索引,所以 (I,J,K,L,M,...)。这意味着最终的数组不仅相当稀疏,而且对于 numpy 来说太大了
-
这看起来像是可以通过广播执行的外部产品。
scipy.sparse仅限于 2d。
标签: python numpy matrix sparse-matrix multiplication