Eu tenho uma matriz que pode ser parecida com esta:
ANOVAInputMatrixValuesArray = [[ 0.96488889, 0.73641667, 0.67521429, 0.592875,
0.53172222], [ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]]
Observe que uma das linhas tem valor zero no final. Desejo excluir qualquer linha que contenha um zero, mantendo qualquer linha que contenha valores diferentes de zero em todas as células.
Mas a matriz terá diferentes números de linhas sempre que for preenchida e os zeros estarão localizados em diferentes linhas a cada vez.
Eu obtenho o número de elementos diferentes de zero em cada linha com a seguinte linha de código:
NumNonzeroElementsInRows = (ANOVAInputMatrixValuesArray != 0).sum(1)
Para a matriz acima, NumNonzeroElementsInRows
contém: [5 4]
O cinco indica que todos os valores possíveis na linha 0 são diferentes de zero, enquanto o quatro indica que um dos valores possíveis na linha 1 é zero.
Portanto, estou tentando usar as seguintes linhas de código para localizar e excluir linhas que contêm valores zero.
for q in range(len(NumNonzeroElementsInRows)):
if NumNonzeroElementsInRows[q] < NumNonzeroElementsInRows.max():
p.delete(ANOVAInputMatrixValuesArray, q, axis=0)
Mas, por algum motivo, esse código não parece fazer nada, embora muitos comandos de impressão indiquem que todas as variáveis parecem estar sendo preenchidas corretamente, levando ao código.
Deve haver uma maneira fácil de simplesmente "excluir qualquer linha que contenha um valor zero".
Alguém pode me mostrar qual código escrever para fazer isso?
fonte
numpy.delete(x, index)
não funcionava.Aqui está um liner (sim, é semelhante ao user333700, mas um pouco mais direto):
>>> import numpy as np >>> arr = np.array([[ 0.96488889, 0.73641667, 0.67521429, 0.592875, 0.53172222], [ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]]) >>> print arr[arr.all(1)] array([[ 0.96488889, 0.73641667, 0.67521429, 0.592875 , 0.53172222]])
A propósito, este método é muito, muito mais rápido do que o método de matriz mascarada para grandes matrizes. Para uma matriz de 2048 x 5, esse método é cerca de 1000 vezes mais rápido.
A propósito, o método do user333700 (a partir de seu comentário) foi um pouco mais rápido em meus testes, embora me confunda o porquê.
fonte
any
curto-circuitos para verdadeiro no primeiro caso verdadeiro detectado;all
curto-circuitos para falso no primeiro caso falso detectado. Nesse caso, o curto-circuito deve ser um empate, mas fazer o extra não deve torná-lo mais lento na minha opinião.Isso é semelhante à sua abordagem original e usará menos espaço do que a resposta do unutbu , mas suspeito que será mais lento.
>>> import numpy as np >>> p = np.array([[1.5, 0], [1.4,1.5], [1.6, 0], [1.7, 1.8]]) >>> p array([[ 1.5, 0. ], [ 1.4, 1.5], [ 1.6, 0. ], [ 1.7, 1.8]]) >>> nz = (p == 0).sum(1) >>> q = p[nz == 0, :] >>> q array([[ 1.4, 1.5], [ 1.7, 1.8]])
A propósito, sua linha
p.delete()
não funciona para mim -ndarray
não tem um.delete
atributo.fonte
numpy fornece uma função simples para fazer exatamente a mesma coisa: supondo que você tenha um array mascarado 'a', chamar numpy.ma.compress_rows (a) excluirá as linhas contendo um valor mascarado. Eu acho que é muito mais rápido assim ...
fonte
import numpy as np arr = np.array([[ 0.96488889, 0.73641667, 0.67521429, 0.592875, 0.53172222],[ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]]) print(arr[np.where(arr != 0.)])
fonte
Posso ser tarde demais para responder a essa pergunta, mas gostaria de compartilhar minha opinião para o benefício da comunidade. Para este exemplo, deixe-me chamar sua matriz de 'ANOVA', e estou assumindo que você está apenas tentando remover linhas dessa matriz com 0s apenas na 5ª coluna.
indx = [] for i in range(len(ANOVA)): if int(ANOVA[i,4]) == int(0): indx.append(i) ANOVA = [x for x in ANOVA if not x in indx]
fonte