Это было бы что-то вроде:

аюсь удалить строку i и столбец i, когда строка 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.

 Dillon Davis16 окт. 2017 г., 20:37
Судя по примеру ОП, я верю в это. Индексы строки и столбца креста должны совпадать, конечно.
 Ramsey Bissex16 окт. 2017 г., 20:44
Да, это то, что я имею в виду, извините за путаницу.
 Dillon Davis16 окт. 2017 г., 20:15
Нет. Сначала я тоже так думал, но я полагаю, что первоначальный вопрос хочет удалить столбцы И строки одновременно, когда ОБА равны нулю.
 Ramsey Bissex16 окт. 2017 г., 21:10
Там мы идем должны быть исправлены сейчас спасибо за ваше терпение.
 Divakar16 окт. 2017 г., 20:46
@RamseyBissex Пожалуйста, отредактируйте вопрос с правильным ожидаемым выводом. Также, если возможно, используйте более крупный / общий пример и покажите нам ожидаемый результат.

Ответы на вопрос(2)

matrix == 0" вне вашего цикла for и использовать эту матрицу вместо переоценки ее при каждом запуске.

Это было бы что-то вроде:

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
Решение Вопроса

Векторизованный подход с маскированием -

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]])
 Dillon Davis16 окт. 2017 г., 20:34
Я не верю, что это отвечает на первоначальный вопрос. Это удаляет все строки или столбцы, которые все являются нулями, однако - я думаю, что плакат хочет удалить строкиа также столбцы, которыеобе 0 одновременно. Вы можете исправить сообщение, добавив битовые маски друг к другу, прежде чем использовать их в np.ix_ ().

Ваш ответ на вопрос