Seria possível, dado um array A, índices de linha e índices de coluna ruins, usar o fatiamento para criar um novo array que não tenha essas linhas ou colunas?
Isso pode ser feito com np.delete da seguinte maneira:
import numpy as np
A=np.random.rand(20,16)
bad_col=np.arange(0,A.shape[1],4)[1:]
bad_row=np.arange(0,A.shape[0],4)[1:]
Anew=np.delete(np.delete(A,bad_row,0),bad_col,1)
print('old shape ',A.shape)
print('new shape ',Anew.shape)
Eu também sei que você pode usar fatiamento para selecionar certas colunas e linhas de um array. Mas eu estou pensando se ele pode ser usado para excluir certas colunas e linhas? E se não, qual a melhor maneira além np.delete
de fazer isso.
EDIT: Com base nos comentários, pode não ser possível com o slicing no lugar. Que tal criar um novo array com indexação avançada?
Pode ser feito com o seguinte código, mas é lento, procure uma alternativa mais rápida:
good_col = [i for i in range(A.shape[1]) if i==0 or i % 4 != 0]
good_row=[ i for i in range(A.shape[0]) if i==0 or i % 4 != 0]
Anew2=A[good_row,:][:,good_col]
print('new shape ',Anew2.shape)
Obrigado
Você não pode remover itens de um array sem mover todos os itens (o que é lento para arrays grandes) ou criar um novo. Não há outra solução.
No Numba ou Cython, você pode criar diretamente um novo array com uma operação em vez de 2, então deve ser cerca de duas vezes mais rápido para arrays grandes. Deve ser ainda mais rápido para arrays pequenos porque as funções Numpy têm uma sobrecarga significativa para arrays pequenos.
As visualizações Numpy são contíguas ou stride. Não há como usar um stride variável ao longo de um eixo dado. Isso foi definido dessa forma por uma questão de desempenho. Assim, se você quiser selecionar apenas colunas e linhas com um ID par, você pode (porque há um stride constante para cada eixo que pode ser definido para a visualização resultante). No entanto, você não pode selecionar todas as linhas/colunas com um ID que não seja divisível por 4, por exemplo (porque não há visualizações que possam ser construídas com um stride constante).
Observe que se você tentar trapacear criando uma nova dimensão e depois achatar a visualização, o Numpy criará uma cópia (porque não há outra maneira).