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.

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).


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.


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!


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.


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.


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()
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.