¿Cuál es la diferencia entre las funciones array () y asarray () de Numpy?

298

¿Cuál es la diferencia entre Numpy's array()y las asarray()funciones? ¿Cuándo deberías usar uno en lugar del otro? Parecen generar una salida idéntica para todas las entradas que se me ocurren.

Benjamin Hodgson
fuente

Respuestas:

110

Desde otras preguntas están siendo redirigidos a esta que preguntar sobre asanyarrayo otras rutinas de creación de la matriz , es probable que vale la pena tener un resumen breve de lo que hace cada uno de ellos.

Las diferencias se refieren principalmente a cuándo devolver la entrada sin cambios, en lugar de hacer una nueva matriz como copia.

arrayofrece una amplia variedad de opciones (la mayoría de las otras funciones son envoltorios delgados a su alrededor), incluidas banderas para determinar cuándo copiar. Una explicación completa tomaría tanto tiempo como los documentos (vea Creación de matrices , pero brevemente, aquí hay algunos ejemplos:

Supongamos que aes un ndarray, y mes un matrix, y ambos tienen una dtypede float32:

  • np.array(a)y np.array(m)copiará ambos, porque ese es el comportamiento predeterminado.
  • np.array(a, copy=False)y np.array(m, copy=False)copiará mpero no a, porque mno es un ndarray.
  • np.array(a, copy=False, subok=True)y np.array(m, copy=False, subok=True)no copiará ninguno, porque mes un matrix, que es una subclase de ndarray.
  • np.array(a, dtype=int, copy=False, subok=True)copiará ambos, porque el dtypeno es compatible.

La mayoría de las otras funciones son envoltorios delgados alrededor de arrayese control cuando se realiza la copia:

  • asarray: La entrada se devolverá sin copiar si es compatible ndarray( copy=False).
  • asanyarray: La entrada se devolverá sin copiar si es una ndarraysubclase compatible o como matrix( copy=False, subok=True).
  • ascontiguousarray: La entrada se devolverá sin copiar si es compatible ndarrayen orden C contiguo ( copy=False, order='C').
  • asfortranarray: La entrada se devolverá sin copiar si es compatible ndarrayen el orden contiguo de Fortran ( copy=False, order='F').
  • require: La entrada se devolverá sin copiar si es compatible con la cadena de requisitos especificada.
  • copy: La entrada siempre se copia.
  • fromiter: La entrada se trata como un iterable (por ejemplo, puede construir una matriz a partir de elementos de un iterador, en lugar de una objectmatriz con el iterador); siempre copiado

También hay funciones de conveniencia, como asarray_chkfinite(las mismas reglas de copia que asarray, pero aumenta ValueErrorsi hay alguno nano infvalores), y constructores para subclases como matrixo para casos especiales como matrices de registros y, por supuesto, el ndarrayconstructor real (que le permite crear una matriz directamente fuera de zancadas sobre un búfer).

abarnert
fuente
Gracias por eso, es muy útil
Kris
234

La definición deasarray es:

def asarray(a, dtype=None, order=None):
    return array(a, dtype, copy=False, order=order)

Entonces es como array, excepto que tiene menos opciones, y copy=False. arraytiene copy=Truepor defecto.

La principal diferencia es que array(por defecto) hará una copia del objeto, mientras asarrayque no lo hará a menos que sea necesario.

unutbu
fuente
13
Entonces, ¿cuándo debemos usar cada uno? Si crea una matriz desde cero, ¿cuál es mejor array([1, 2, 3])o asarray([1, 2, 3])?
endolito el
15
@endolith: [1, 2, 3]es una lista de Python, por lo que se debe hacer una copia de los datos para crear el ndarary. Por lo tanto, use np.arraydirectamente en lugar de np.asarraylo que enviaría el copy=Falseparámetro np.array. Se copy=Falseignora si se debe hacer una copia como sería en este caso. Si compara los dos usando %timeitIPython, verá una diferencia para las listas pequeñas, pero no importa cuál use para las listas grandes.
unutbu
3
Eso también tiene sentido según los nombres de los métodos: "asarray": trate esto como una matriz (in situ), es decir, simplemente está cambiando su punto de vista en esta lista / matriz. "matriz": Realmente convierte esto a una nueva matriz.
denvar
1
¿qué tal np.asanyarray?
Lee
3
@Lee: asarraysiempre devuelve un ndarray. asanyarraydevolverá una subclase de ndarraysi eso es lo que se le pasó. Por ejemplo, an np.matrixes una subclase de ndarray. Entonces np.asanyarray(np.matrix(...))devuelve la misma matriz, mientras que np.asarray(np.matrix(...))convierte la matriz en an ndarray.
unutbu
114

La diferencia se puede demostrar con este ejemplo:

  1. generar una matriz

    >>> A = numpy.matrix(numpy.ones((3,3)))
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
  2. usar numpy.arraypara modificar A. No funciona porque estás modificando una copia

    >>> numpy.array(A)[2]=2
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
  3. usar numpy.asarraypara modificar A. Funcionó porque está modificando Apropio

    >>> numpy.asarray(A)[2]=2
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 2.,  2.,  2.]])

¡Espero que esto ayude!

Bobbie Wu
fuente
13

Las diferencias se mencionan claramente en la documentación de arrayy asarray. Las diferencias se encuentran en la lista de argumentos y, por lo tanto, en la acción de la función en función de esos parámetros.

Las definiciones de funciones son:

numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)

y

numpy.asarray(a, dtype=None, order=None)

Los siguientes argumentos son aquellos a los que se puede pasar arrayy no asarray como se menciona en la documentación:

copy: bool, opcional Si es verdadero (predeterminado), el objeto se copia . De lo contrario, solo se realizará __array__una copia si devuelve una copia, si obj es una secuencia anidada o si se necesita una copia para satisfacer cualquiera de los otros requisitos (dtype, order, etc.).

subok: bool, opcional Si es Verdadero, entonces se pasarán las subclases , de lo contrario, la matriz devuelta se verá obligada a ser una matriz de clase base (predeterminada).

ndmin: int, opcional Especifica el número mínimo de dimensiones que debe tener la matriz resultante . Las personas estarán preajustadas a la forma según sea necesario para cumplir con este requisito.

Asheeshr
fuente
1

Aquí hay un ejemplo simple que puede demostrar la diferencia.

La principal diferencia es que la matriz hará una copia de los datos originales y, utilizando diferentes objetos, podemos modificar los datos en la matriz original.

import numpy as np
a = np.arange(0.0, 10.2, 0.12)
int_cvr = np.asarray(a, dtype = np.int64)

Los contenidos en la matriz (a) permanecen intactos, y aún así, podemos realizar cualquier operación en los datos utilizando otro objeto sin modificar el contenido en la matriz original.

vivek
fuente
0

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

Úselo asarray(x)cuando desee asegurarse de que xserá una matriz antes de realizar cualquier otra operación. Si xya es una matriz, no se realizará ninguna copia. No causaría un impacto de rendimiento redundante.

Aquí hay un ejemplo de una función que garantiza que xse convierta primero en una matriz.

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