Como posso remover alguns elementos específicos de uma matriz numpy? Diga que eu tenho
import numpy as np
a = np.array([1,2,3,4,5,6,7,8,9])
Eu quero remover 3,4,7
de a
. Tudo o que sei é o índice dos valores ( index=[2,3,6]
).
Use numpy.delete () - retorna uma nova matriz com sub-matrizes ao longo de um eixo excluído
numpy.delete(a, index)
Para sua pergunta específica:
import numpy as np
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
index = [2, 3, 6]
new_a = np.delete(a, index)
print(new_a) #Prints `[1, 2, 5, 6, 8, 9]`
Observe que numpy.delete()
retorna uma nova matriz, pois os escalares da matriz são imutáveis, semelhantes às seqüências de caracteres no Python, portanto, toda vez que uma alteração é feita, um novo objeto é criado. Ou seja, para citar os delete()
documentos :
"Uma cópia de arr com os elementos especificados por obj removidos. Observe que a exclusão não ocorre no local ..."
Se o código que eu postar tiver saída, é o resultado da execução do código.
Há uma função embutida numpy para ajudar nisso.
fonte
np.setdiff1d(np.array(['one','two']),np.array(['two', 'three']))
Uma matriz Numpy é imutável , o que significa que você tecnicamente não pode excluir um item dela. No entanto, você pode construir uma nova matriz sem os valores que não deseja, assim:
fonte
a[0]=1
modificaa
no local. Mas eles não podem ser redimensionados.Para excluir por valor:
fonte
Não sendo uma pessoa entorpecida, tirei uma foto com:
De acordo com meus testes, isso supera
numpy.delete()
. Não sei por que esse seria o caso, talvez devido ao pequeno tamanho da matriz inicial?Essa é uma diferença bastante significativa (na direção oposta ao que eu estava esperando), alguém tem alguma idéia de por que esse seria o caso?
Ainda mais estranhamente, passar
numpy.delete()
uma lista tem um desempenho pior do que percorrer a lista e fornecer índices únicos.Editar: Parece ter a ver com o tamanho da matriz. Com matrizes grandes,
numpy.delete()
é significativamente mais rápido.Obviamente, tudo isso é irrelevante, pois você sempre deve ter clareza e evitar reinventar a roda, mas achei um pouco interessante, então pensei em deixá-la aqui.
fonte
a = delte_stuff(a)
em sua primeira iteração, quea
diminui a cada iteração. Quando você usa a função inbuild, não armazena o valor novamente em a, o que mantém a no tamanho original! Além disso, você pode acelerar drasticamente sua função, ao criar um conjunto deindex
e de verificar se é para excluir ou não um item. Corrigindo as duas coisas, recebo 10k itens: 6,22 ms por loop com sua função, 4,48 ms pornumpy.delete
, o que é aproximadamente o que você esperaria.np.array(list(range(x)))
usarnp.arange(x)
e para criar o índice, você pode usarnp.s_[::2]
.Se você não conhece o índice, não pode usar
logical_and
fonte
Usar
np.delete
é a maneira mais rápida de fazer isso, se soubermos os índices dos elementos que queremos remover. No entanto, para completar, deixe-me adicionar outra maneira de "remover" os elementos da matriz usando uma máscara booleana criada com a ajuda denp.isin
. Este método permite remover os elementos, especificando-os diretamente ou por seus índices:Remover por índices :
Remova por elementos (não se esqueça de recriar o original,
a
pois ele foi reescrito na linha anterior):fonte
Remover índice específico (eu removi 16 e 21 da matriz)
Resultado:
fonte
Você também pode usar conjuntos:
fonte