当行i和列i都包含全0时,我试图同时删除行i和列i。例如,在这种情况下,我们可以看到第0行全为零,第0列全为零,因此删除了第0行和第0列。与第2行和第4行的列相同。第1行全为零,但第1列全为零,因此都不会被删除。

[0,0,0,0,0]
[0,1,0,1,0]
[0,0,0,0,0]
[0,0,0,0,0]
[0,0,0,0,0]


会成为

[1,1]
[0,0]


另一个例子:

[0,0,1,0,0,1]
[0,0,0,0,0,0]
[0,0,0,0,0,0]
[0,0,0,0,0,0]
[0,0,0,0,0,0]
[0,0,1,0,1,0]


将更改为:

[0,1,0,1]
[0,0,0,0]
[0,0,0,0]
[0,1,1,0]


这是我用来计算的代码:

def remove(matrix):
    for i, x in reversed(list(enumerate(matrix))):
        if np.all(matrix == 0, axis=0)[i] and np.all(matrix == 0, axis=1)[i]:
            matrix = np.delete(matrix,i,axis=0)
            matrix = np.delete(matrix,i,axis=1)
    return matrix


经过测试,这条线是迄今为止最多的时间:

if np.all(matrix == 0, axis=0)[i] and np.all(matrix == 0, axis=1)[i]:


有没有更合适的方法以这种方式测试行和列?我使用的矩阵是一个稀疏的二进制矩阵。我没有使用任何稀疏矩阵类,只是ndarray。

最佳答案

带遮罩的矢量化方法-

def remove_vectorized(a):
    mask = a==0
    m_row = ~mask.all(1)
    m_col = ~mask.all(0)
    comb_mask = m_row | m_col
    return a[comb_mask][:,comb_mask] #or a[np.ix_(comb_mask, comb_mask)]


样品运行

情况1 :

In [485]: a
Out[485]:
array([[0, 0, 0, 0, 0],
       [0, 1, 0, 1, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0]])

In [486]: remove_vectorized(a)
Out[486]:
array([[1, 1],
       [0, 0]])


案例2:

In [489]: a
Out[489]:
array([[0, 0, 1, 0, 0, 1],
       [0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 0, 1, 0, 1, 0]])

In [490]: remove_vectorized(a)
Out[490]:
array([[0, 1, 0, 1],
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 1, 1, 0]])

关于python - 使用numpy有效地测试矩阵行和列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46774681/

10-09 00:12