Efficiently Test Matrix Rows And Columns With Numpy
I am trying to remove both the row i and column i when both the row i and column i contains all 0s. For example in this case we can see that row 0 is all zeros and column 0 is all
Solution 1:
Vectorized approach with masking -
defremove_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)]
Sample runs
Case #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]])
Case #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]])
Solution 2:
One thing you can do- evaluate the boolean matrix "matrix == 0" outside of your for loop, and use that matrix instead of reevaluating it every run.
It'd be something like:
def remove(matrix):
binary_matrix = matrix == 0
for i, x in reversed(list(enumerate(matrix))):
if np.all(binary_matrix , axis=0)[i] and np.all(binary_matrix , axis=1)[i]:
matrix = np.delete(matrix,i,axis=0)
matrix = np.delete(matrix,i,axis=1)
binary_matrix = np.delete(binary_matrix ,i,axis=0)
binary_matrix = np.delete(binary_matrix ,i,axis=1)
return matrix
Post a Comment for "Efficiently Test Matrix Rows And Columns With Numpy"