Skip to main content
 首页 » 编程设计

python之二维数组的numpy 3d张量

2025年05月04日13cloudgamer

我有一个稀疏矩阵。我知道每一列都有两个非零值,所以我想使用定义为置换矩阵列表的张量压缩(删除零)。

我有

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]])