我有一个稀疏矩阵。我知道每一列都有两个非零值,所以我想使用定义为置换矩阵列表的张量压缩(删除零)。
我有
src = np.array([[2, 9, 0, 2, 4],
[0, 1, 8, 8, 0],
[1, 0, 3, 0, 0],
[0, 0, 0, 0, 7]])
我要
trg = np.array([[2, 9, 8, 2, 4],
[1, 1, 3, 8, 7]])
这是相同的矩阵,但没有零。
我已经硬编码了选择非零值的张量
p = np.array([
[[1,0,0,0],[0,0,1,0]],
[[1,0,0,0],[0,1,0,0]],
[[0,1,0,0],[0,0,1,0]],
[[1,0,0,0],[0,1,0,0]],
[[1,0,0,0],[0,0,0,1]]
])
我可以遍历 p 和 src 来获得 trg
>>> for i in range(len(p)):
>>> print(p[i] @ src[:,i])
[2 1]
[9 1]
[8 3]
[2 8]
[4 7]
我如何用 numpy 的方式(即没有循环)?我已经尝试过 tensordot 并转置我的矩阵,但没有成功。
请您参考如下方法:
由于行优先排序,我们可以使用转置版本到 index具有非零掩码的数组,然后 reshape -
out = src.T[src.T!=0].reshape(src.shape[1],-1).T
sample 运行-
In [19]: src
Out[19]:
array([[2, 9, 0, 2, 4],
[0, 1, 8, 8, 0],
[1, 0, 3, 0, 0],
[0, 0, 0, 0, 7]])
In [20]: src.T[src.T!=0].reshape(src.shape[1],-1).T
Out[20]:
array([[2, 9, 8, 2, 4],
[1, 1, 3, 8, 7]])
