Acredite ou não, depois de traçar o perfil do meu código atual, a operação repetitiva da reversão numpy da matriz consumiu uma grande parte do tempo de execução. O que tenho agora é o método comum baseado em exibição:
reversed_arr = arr[::-1]
Existe alguma outra maneira de fazê-lo de forma mais eficiente, ou é apenas uma ilusão da minha obsessão por desempenho numpy irrealista?
arr[::-1]
apenas retorna uma visão invertida. É o mais rápido possível, e não depende do número de itens na matriz, pois apenas altera os avanços. O que você está revertendo é realmente uma matriz numpy?arr
é uma matriz numpy.f2py
é seu amigo! Muitas vezes, vale a pena escrever partes críticas de desempenho de um algoritmo (especialmente em computação científica) em outra linguagem e chamá-lo de python. Boa sorte!arr[::-1]
: github.com/numpy/numpy/blob/master/numpy/lib/twodim_base.py . Pesquise pordef flipud
. A função tem literalmente quatro linhas.Respostas:
Quando você cria,
reversed_arr
está criando uma exibição na matriz original. Você pode alterar a matriz original e a exibição será atualizada para refletir as alterações.Você está recriando a exibição com mais frequência do que precisa? Você deve conseguir fazer algo assim:
Eu não sou um especialista numpy, mas isso parece ser a maneira mais rápida de fazer as coisas numpy. Se é isso que você já está fazendo, acho que não pode melhorar.
PS Ótima discussão sobre visões numpy aqui:
Ver em uma matriz numpy?
fonte
look_at
que a função deve fazer?reversed_arr
ainda é utilizável após a alteração dos dados subjacentes. A gravação de novos valores na matriz não invalida a exibição. Na verdade, você também pode usar a visualização para escrever novos valores na matriz.reversed_arr[0] = 99
definiria o último elemento da matriz como 99, o mesmo quearr[-1] = 99
faria.Como mencionado acima,
a[::-1]
realmente cria apenas uma visualização, portanto é uma operação de tempo constante (e, como tal, não leva mais tempo à medida que a matriz cresce). Se você precisar que o array seja contíguo (por exemplo, porque você está executando muitas operações vetoriais),ascontiguousarray
é tão rápido quantoflipup
/fliplr
:Código para gerar o gráfico:
fonte
Porque isso parece não estar marcado como respondido ainda ... A resposta de Thomas Arildsen deve ser a correta: basta usar
se for uma matriz 1d (matriz da coluna).
Com matrizes fazer
se você deseja reverter linhas e
flipud(matrix)
se deseja inverter colunas. Não há necessidade de transformar seu array de colunas 1d em um array de linhas bidimensionais (matriz com uma camada None) e depois invertê-lo.fonte
np.fliplr()
vira a matriz da esquerda para a direita.Observe que, para matrizes 1d, é necessário enganá-lo um pouco:
fonte
reversed_arr = np.flipud(arr1d)
parece funcionar diretamente.Vou expandir a resposta anterior sobre
np.fliplr()
. Aqui está um código que demonstra a construção de uma matriz 1d, transformando-a em uma matriz 2d, invertendo-a e convertendo-a novamente em uma matriz 1d.time.clock()
será usado para manter o tempo, que é apresentado em termos de segundos.Com a declaração de impressão descomentada:
Com a declaração impressa comentada:
Então, em termos de eficiência, acho isso decente. Para aqueles de vocês que gostam de fazer isso em uma linha, aqui está essa forma.
fonte
Expandindo o que outros disseram, darei um pequeno exemplo.
Se você tem uma matriz 1D ...
Mas se você estiver trabalhando com uma matriz 2D ...
Na verdade, isso não inverte a matriz.
Deve usar np.flip para realmente reverter os elementos
Se você deseja imprimir os elementos de uma matriz um por um, use o plano juntamente com o flip
fonte
Para que ele funcione com números negativos e uma lista longa, você pode fazer o seguinte:
Onde flipud é para 1d arra
fonte