Удалить строку / столбец из массива numpy, если все его элементы равны определенному значению - PullRequest
1 голос
/ 14 апреля 2019

Я пытаюсь найти лаконичный способ обхода всех строк и всех столбцов пустого массива и удаления строки или столбца, если все его значения равны, например, inf.

Допустим, у меня есть следующий массив:

import numpy as np

m = np.array([[1,2,3,4],
             [np.inf,np.inf,np.inf,np.inf],
             [9,10,11,12]])

Тогда, если я использую,

row = 0
while row < m.shape[0]:
    if np.all(np.isinf(m[row,:])):
        m = np.delete(m,row,axis=0)
        row -= 1
    row += 1

print(m)

Я получу вывод:

[[1,2,3,4],     
[9,10,11,12]]

Iможно использовать аналогичный метод для удаления столбца всего infs.Однако этот метод довольно громоздкий, поэтому я попытался использовать следующее:

m = m[np.all(~np.isinf(m),axis=1)]

Это прекрасно работает при поиске и удалении всех строк infs, но при попытке выполнить следующее, чтобы найти и удалить всестолбцы, которые содержат все infs, метод сталкивается с проблемами,

m = np.array([[1,2,np.inf,4],
                        [5,6,np.inf,8],
                        [9,10,np.inf,12]])

m = m[np.all(~np.isinf(m),axis=0)]

, выдавая следующую ошибку

IndexError: boolean index did not match indexed array along dimension 0; dimension is 3 but corresponding boolean dimension is 4

Я думал, что использование axis=1 будет искать по каждой строке,и axis=0 будет искать по каждому столбцу, но мне кажется, что я не понимаю, как работает axis.Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 14 апреля 2019

Просто замените строку, которая выдает ошибку, на эту:

m = m[:, np.all(~np.isinf(m),axis=0)]
...