小编Ric*_*ven的帖子

(稀疏)2D numpy 数组的每行/列的快速非零索引

我正在寻找获取每行和每列二维数组非零索引列表的最快方法。以下是一段工作代码:

preds = [matrix[:,v].nonzero()[0] for v in range(matrix.shape[1])]
descs = [matrix[v].nonzero()[0] for v in range(matrix.shape[0])]
Run Code Online (Sandbox Code Playgroud)

示例输入:

matrix = np.array([[0,0,0,0],[1,0,0,0],[1,1,0,0],[1,1,1,0]])
Run Code Online (Sandbox Code Playgroud)

示例输出

preds = [array([1, 2, 3]), array([2, 3]), array([3]), array([], dtype=int64)]
descs = [array([], dtype=int64), array([0]), array([0, 1]), array([0, 1, 2])]
Run Code Online (Sandbox Code Playgroud)

(这些列表被称为 preds 和 descs,因为当矩阵被解释为邻接矩阵时,它们指的是 DAG 中的前辈和后裔,但这对问题来说并不重要。)

时序示例: 出于时序目的,以下矩阵是一个很好的代表:

test_matrix = np.zeros(shape=(4096,4096),dtype=np.float32)
for k in range(16):
    test_matrix[256*(k+1):256*(k+2),256*k:256*(k+1)]=1
Run Code Online (Sandbox Code Playgroud)

背景:在我的代码中,对于 4000x4000 矩阵,这两行占用了 75% 的时间,而随后的拓扑排序和 DP 算法只占用了四分之一的时间。矩阵中大约 5% 的值是非零值,因此可能适用稀疏矩阵解决方案。

谢谢你。

(关于这里发布的建议:https : //scicomp.stackexchange.com/questions/35242/fast-nonzero-indices-per-row-column-for-sparse-2d-numpy-array 那里也有答案我将在评论中提供时间。此链接包含一个已接受的答案,速度是其两倍。

python arrays numpy scipy sparse-matrix

2
推荐指数
1
解决办法
277
查看次数

标签 统计

arrays ×1

numpy ×1

python ×1

scipy ×1

sparse-matrix ×1