Respostas:
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 deasarray
é:
def asarray(a, dtype=None, order=None):
return array(a, dtype, copy=False, order=order)
Então é como array
, exceto que tem menos opções, e copy=False
. array
tem copy=True
por padrão.
A principal diferença é que array
(por padrão) fará uma cópia do objeto, enquanto asarray
não fará a menos que seja necessário.
array([1, 2, 3])
ou asarray([1, 2, 3])
?
[1, 2, 3]
é uma lista Python, portanto, uma cópia dos dados deve ser feita para criar o arquivo ndarary
. Portanto, use np.array
diretamente em vez do np.asarray
qual enviaria o copy=False
parâmetro para np.array
. O copy=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 um ndarray
. asanyarray
retornará uma subclasse de ndarray
se foi isso que foi passado para ela. Por exemplo, an np.matrix
é uma subclasse de ndarray
. Então np.asanyarray(np.matrix(...))
retorna a mesma matriz, enquanto que np.asarray(np.matrix(...))
converte a matriz em um ndarray
.
A diferença pode ser demonstrada por este exemplo:
gerar uma matriz
>>> A = numpy.matrix(numpy.ones((3,3)))
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
use numpy.array
para modificar A
. Não funciona porque você está modificando uma cópia
>>> numpy.array(A)[2]=2
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
use numpy.asarray
para modificar A
. Funcionou porque você está modificando A
-se
>>> numpy.asarray(A)[2]=2
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 2., 2., 2.]])
Espero que isto ajude!
As diferenças são mencionadas claramente na documentação de array
e asarray
. 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:
numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
e
numpy.asarray(a, dtype=None, order=None)
Os argumentos a seguir são aqueles que podem ser passados array
e não asarray
mencionados na documentação:
copy: bool, opcional Se true (padrão), o objeto é copiado . Caso contrário, uma cópia será feita apenas se
__array__
retornar uma cópia, se obj for uma sequência aninhada ou se for necessária uma cópia para atender a qualquer um dos outros requisitos (dtype, order, etc.).subok: bool, opcional Se True, as subclasses serão passadas , caso contrário, a matriz retornada será forçada a ser uma matriz de classe base (padrão).
ndmin: int, opcional Especifica o número mínimo de dimensões que a matriz resultante deve ter. As peças serão pré-pendentes na forma necessária para atender a esse requisito.
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.
import numpy as np
a = np.arange(0.0, 10.2, 0.12)
int_cvr = np.asarray(a, dtype = np.int64)
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.
asarray(x)
é como array(x, copy=False)
Use asarray(x)
quando quiser garantir que x
haverá uma matriz antes de qualquer outra operação. Se x
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.
def mysum(x):
return np.asarray(x).sum()