import numpy as np
y = np.array(((1,2,3),(4,5,6),(7,8,9)))
OUTPUT:
print(y.flatten())
[1 2 3 4 5 6 7 8 9]
print(y.ravel())
[1 2 3 4 5 6 7 8 9]
Ambas as funções retornam a mesma lista. Então, qual é a necessidade de duas funções diferentes executando o mesmo trabalho.
python
numpy
multidimensional-array
flatten
numpy-ndarray
criptomanico
fonte
fonte
Respostas:
A API atual é a seguinte:
flatten
sempre retorna uma cópia.ravel
retorna uma visão da matriz original sempre que possível. Isso não é visível na saída impressa, mas se você modificar a matriz retornada pelo ravel, poderá modificar as entradas na matriz original. Se você modificar as entradas em uma matriz retornada do achatamento, isso nunca acontecerá. O ravel geralmente será mais rápido, pois nenhuma memória é copiada, mas você precisa ter mais cuidado ao modificar a matriz que retorna.reshape((-1,))
obtém uma visualização sempre que os avanços da matriz permitirem, mesmo que isso signifique que você nem sempre obtém uma matriz contígua.fonte
a.flatten()
deve obter uma cópia com certeza,a.ravel()
para evitar a maioria das cópias, mas ainda assim garante que a matriz retornada seja contígua ea.reshape((-1,))
para realmente obter uma visualização sempre que os passos da matriz permitirem, mesmo que isso signifique que você nem sempre obtém uma matriz contígua.ravel
garante uma matriz contígua e, portanto, não é garantido que ele retorne uma visualização;reshape
sempre retorna uma exibição e, portanto, não é garantido que ele retorne uma matriz contígua.reshape(-1)
é equivalente areshape((-1,))
Como explicado aqui, a principal diferença é que:
flatten
é um método de um objeto ndarray e, portanto, só pode ser chamado para matrizes numpy verdadeiras.ravel
é uma função no nível da biblioteca e, portanto, pode ser chamada em qualquer objeto que possa ser analisado com êxito.Por exemplo
ravel
, funcionará em uma lista de ndarrays, enquantoflatten
não estiver disponível para esse tipo de objeto.O @IanH também aponta diferenças importantes na manipulação de memória em sua resposta.
fonte
ndarray
'sAqui está o espaço para nome correto para as funções:
numpy.ndarray.flatten
numpy.ravel
Ambas as funções retornam matrizes 1D achatadas, apontando para as novas estruturas de memória.
No exemplo superior:
Como verificamos se algo é uma cópia? Usando o
.base
atributo dondarray
. Se for uma visualização, a base será a matriz original; se for uma cópia, a base seráNone
.fonte