Qual é a diferença entre as funções array () e asarray () do Numpy?

298

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.

Benjamin Hodgson
fonte

Respostas:

110

Desde outras perguntas estão sendo redirecionados para este que perguntar sobre asanyarrayou 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.

arrayoferece 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 dtypede 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á, mmas não a, porque mnã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 dtypenão é compatível.

A maioria das outras funções são invólucros finos em torno arraydesse 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 ndarrayou subclasse como matrix( copy=False, subok=True).
  • ascontiguousarray: A entrada será retornada sem cópia se for compatível ndarrayna ordem C contínua ( copy=False, order='C').
  • asfortranarray: A entrada será retornada sem cópia se for compatível ndarrayna 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 objectmatriz 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 ValueErrorse houver algum nanou infvalores), e construtores para subclasses como matrixou para casos especiais como matrizes de registro e, claro, o ndarrayconstrutor real (que permite criar uma matriz diretamente fora de controle sobre um buffer).

abarnert
fonte
Obrigado por isso, é muito útil
Kris
234

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. arraytem copy=Truepor padrão.

A principal diferença é que array(por padrão) fará uma cópia do objeto, enquanto asarraynão fará a menos que seja necessário.

unutbu
fonte
13
Então, quando devemos usar cada um? Se estiver criando uma matriz do zero, qual é melhor array([1, 2, 3])ou asarray([1, 2, 3])?
endolith
15
@ endolith: [1, 2, 3]é uma lista Python, portanto, uma cópia dos dados deve ser feita para criar o arquivo ndarary. Portanto, use np.arraydiretamente em vez do np.asarrayqual enviaria o copy=Falseparâmetro para np.array. O copy=Falseserá ignorado se for necessário fazer uma cópia, como seria neste caso. Se você comparar os dois usando o %timeitIPython, verá uma diferença para listas pequenas, mas dificilmente importa qual você usa para listas grandes.
unutbu
3
Isso também faz sentido pelos nomes dos métodos: "asarray": trate isso como uma matriz (local), ou seja, você está apenas mudando sua visão nessa lista / matriz. "array": efetivamente converta isso em um novo array.
Denvar # 4/16
1
que tal np.asanyarray?
Lee
3
@ Lee: asarraysempre retorna um ndarray. asanyarrayretornará uma subclasse de ndarrayse 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.
unutbu 26/07/16
114

A diferença pode ser demonstrada por este exemplo:

  1. gerar uma matriz

    >>> A = numpy.matrix(numpy.ones((3,3)))
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
  2. use numpy.arraypara 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.]])
  3. use numpy.asarraypara 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!

Bobbie Wu
fonte
13

As diferenças são mencionadas claramente na documentação de arraye 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 arraye 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.

asheeshr
fonte
1

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.

vivek
fonte
0

asarray(x) é como array(x, copy=False)

Use asarray(x)quando quiser garantir que xhaverá uma matriz antes de qualquer outra operação. Se xjá é 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 xseja convertida em uma matriz.

def mysum(x):
    return np.asarray(x).sum()
off99555
fonte