Qual é a diferença entre o Numpy array()
e as asarray()
funções? Quando você deve usar um e não o outro? Eles parecem gerar saída idêntica para todas as entradas que consigo pensar.
Desde outras perguntas estão sendo redirecionados para este que perguntar sobre asanyarray
ou outras rotinas de criação de gama , é provavelmente vale a pena ter um resumo breve do que cada um deles faz.
As diferenças são principalmente sobre quando retornar a entrada inalterada, em vez de criar uma nova matriz como uma cópia.
array
oferece uma ampla variedade de opções (a maioria das outras funções são invólucros finos), incluindo sinalizadores para determinar quando copiar. Uma explicação completa levaria apenas o tempo que os documentos (consulte Criação de matrizes , mas brevemente, aqui estão alguns exemplos:
Suponha que a
é um ndarray
, e m
é um matrix
, e ambos têm um dtype
de float32
:
np.array(a)
e np.array(m)
copiará ambos, porque esse é o comportamento padrão.np.array(a, copy=False)
e np.array(m, copy=False)
copiará, m
mas não a
, porque m
não é um ndarray
.np.array(a, copy=False, subok=True)
e np.array(m, copy=False, subok=True)
não copiará nenhum deles, porque m
é a matrix
, que é uma subclasse de ndarray
.np.array(a, dtype=int, copy=False, subok=True)
copiará ambos, porque o dtype
não é compatível.A maioria das outras funções são invólucros finos em torno array
desse controle quando a cópia acontece:
asarray
: A entrada será retornada sem cópia se for compatível ndarray
( copy=False
).asanyarray
: A entrada será retornada sem cópia se for compatível ndarray
ou subclasse como matrix
( copy=False
, subok=True
).ascontiguousarray
: A entrada será retornada sem cópia se for compatível ndarray
na ordem C contínua ( copy=False
, order='C')
.asfortranarray
: A entrada será retornada sem cópia se for compatível ndarray
na ordem Fortran contígua ( copy=False
, order='F'
).require
: A entrada será retornada sem cópia se for compatível com a cadeia de requisitos especificada.copy
: A entrada é sempre copiada.fromiter
: A entrada é tratada como iterável (por exemplo, você pode construir uma matriz a partir dos elementos de um iterador, em vez de uma object
matriz com o iterador); sempre copiado.Também existem funções de conveniência, como asarray_chkfinite
(mesmas regras de cópia que asarray
, mas aumentam ValueError
se houver algum nan
ou inf
valores), e construtores para subclasses como matrix
ou para casos especiais como matrizes de registro e, claro, o ndarray
construtor real (que permite criar uma matriz diretamente fora de controle sobre um buffer).
A definição de
asarray
é:Então é como
array
, exceto que tem menos opções, ecopy=False
.array
temcopy=True
por padrão.A principal diferença é que
array
(por padrão) fará uma cópia do objeto, enquantoasarray
não fará a menos que seja necessário.fonte
array([1, 2, 3])
ouasarray([1, 2, 3])
?[1, 2, 3]
é uma lista Python, portanto, uma cópia dos dados deve ser feita para criar o arquivondarary
. Portanto, usenp.array
diretamente em vez donp.asarray
qual enviaria ocopy=False
parâmetro paranp.array
. Ocopy=False
será ignorado se for necessário fazer uma cópia, como seria neste caso. Se você comparar os dois usando o%timeit
IPython, verá uma diferença para listas pequenas, mas dificilmente importa qual você usa para listas grandes.np.asanyarray
?asarray
sempre retorna umndarray
.asanyarray
retornará uma subclasse dendarray
se foi isso que foi passado para ela. Por exemplo, annp.matrix
é uma subclasse dendarray
. Entãonp.asanyarray(np.matrix(...))
retorna a mesma matriz, enquanto quenp.asarray(np.matrix(...))
converte a matriz em umndarray
.A diferença pode ser demonstrada por este exemplo:
gerar uma matriz
use
numpy.array
para modificarA
. Não funciona porque você está modificando uma cópiause
numpy.asarray
para modificarA
. Funcionou porque você está modificandoA
-seEspero que isto ajude!
fonte
As diferenças são mencionadas claramente na documentação de
array
easarray
. As diferenças estão na lista de argumentos e, portanto, na ação da função dependendo desses parâmetros.As definições de função são:
e
Os argumentos a seguir são aqueles que podem ser passados
array
e nãoasarray
mencionados na documentação:fonte
Aqui está um exemplo simples que pode demonstrar a diferença.
A principal diferença é que o array fará uma cópia dos dados originais e, usando objetos diferentes, podemos modificar os dados no array original.
O conteúdo da matriz (a) permanece intocado e, ainda assim, podemos executar qualquer operação nos dados usando outro objeto sem modificar o conteúdo da matriz original.
fonte
asarray(x)
é comoarray(x, copy=False)
Use
asarray(x)
quando quiser garantir quex
haverá uma matriz antes de qualquer outra operação. Sex
já é uma matriz, nenhuma cópia seria feita. Não causaria um impacto redundante no desempenho.Aqui está um exemplo de uma função que garante que primeiro
x
seja convertida em uma matriz.fonte