¿Cuál es la diferencia entre np.array() y np.asarray()?

7 minutos de lectura

avatar de usuario
Benjamín Hodgson

¿Cuál es la diferencia entre NumPy’s np.array y np.asarray? ¿Cuándo debo usar uno en lugar del otro? Parecen generar resultados idénticos.

avatar de usuario
unutbu

los definicion de asarray es:

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

entonces es como arrayexcepto que tiene menos opciones, y copy=False. array posee copy=True por defecto.

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

  • Entonces, ¿cuándo debemos usar cada uno? Si crea una matriz desde cero, lo que es mejor, array([1, 2, 3]) o asarray([1, 2, 3])?

    – endolito

    2 jun 2014 a las 23:25

  • @endolito: [1, 2, 3] es una lista de Python, por lo que se debe hacer una copia de los datos para crear el ndarary. Así que usa np.array directamente en lugar de np.asarray que enviaría el copy=False parámetro a np.array. los copy=False se ignora si se debe hacer una copia como sería en este caso. Si compara los dos usando %timeit en IPython verá una diferencia para las listas pequeñas, pero poco importa cuál use para las listas grandes.

    – unutbu

    2 jun 2014 a las 23:43

  • Eso también tiene sentido según los nombres de los métodos: “asarray”: trate esto como una matriz (en su lugar), es decir, simplemente está cambiando su vista en esta lista/matriz. “matriz”: en realidad convierte esto en una nueva matriz.

    – jesperk.eth

    4 mayo 2016 a las 18:41

  • qué tal si np.asanyarray?

    – ddzzbbwwmm

    26 de julio de 2016 a las 16:29

  • @Sotavento: asarray siempre devuelve un ndarray. asanyarray devolverá una subclase de ndarray si eso es lo que se le pasó. por ejemplo, un np.matrix es una subclase de ndarray. Asi que np.asanyarray(np.matrix(...)) devuelve la misma matriz, mientras que np.asarray(np.matrix(...)) convierte la matriz en una ndarray.

    – unutbu

    26 de julio de 2016 a las 16:34

avatar de usuario
abarnert

Dado que otras preguntas se están redirigiendo a esta que pregunta sobre asanyarray o otras rutinas de creación de arreglosprobablemente valga la pena tener un breve resumen de lo que hace cada uno de ellos.

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

array ofrece 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 (ver Creación de matricespero brevemente, aquí hay algunos ejemplos:

Asumir a es un ndarrayy m es un matrixy ambos tienen un dtype de 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á m pero no aporque m no es un ndarray.
  • np.array(a, copy=False, subok=True) y np.array(m, copy=False, subok=True) no copiaré ninguno, porque m es un matrixque es una subclase de ndarray.
  • np.array(a, dtype=int, copy=False, subok=True) copiará ambos, porque el dtype no es compatible

La mayoría de las otras funciones son envoltorios delgados alrededor array ese control cuando ocurre la copia:

  • asarray: La entrada se devolverá sin copiar si es compatible ndarray (copy=False).
  • asanyarray: La entrada se devolverá sin copiar si es compatible ndarray o subclase como matrix (copy=False, subok=True).
  • ascontiguousarray: La entrada se devolverá sin copiar si es compatible ndarray en orden C contiguo (copy=False, order="C").
  • asfortranarray: La entrada se devolverá sin copiar si es compatible ndarray en orden Fortran contiguo (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 iterable (por lo que, por ejemplo, puede construir una matriz a partir de los elementos de un iterador, en lugar de un object matriz con el iterador); siempre copiado.

También hay funciones de conveniencia, como asarray_chkfinite (las mismas reglas de copia que asarraypero sube ValueError si hay alguno nan o inf valores) y constructores para subclases como matrix o para casos especiales como arreglos de registros, y por supuesto el real ndarray constructor (que le permite crear una matriz directamente a partir de pasos sobre un búfer).

  • Solo para corregir, el ndarray de Numpy ahora tiene float64 como dtype predeterminado.

    – Mohith7548

    28 de noviembre de 2020 a las 17:59

  • En la primera sección, en el punto 4, en realidad quisiste decir — np.array(a, dtype=int, copy=False, subok=True) y np.array(m, dtype=int, copy=False, subok=True) copiará ambos, porque el dtype no es compatible”. — ¿Correcto? ¡Gracias por adelantado!

    – Milán

    16 de marzo de 2021 a las 0:24


avatar de usuario
bobbie wu

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.array 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.asarray Modificar A. Funcionó porque estás modificando A sí mismo.

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

avatar de usuario
asheeshr

Las diferencias se mencionan claramente en la documentación de array y asarray. Las diferencias radican en la lista de argumentos y, por lo tanto, 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 los que se pueden pasar a array y no asarray como se menciona en la documentación:

copia: bool, opcional Si es verdadero (predeterminado), el objeto se copia. De lo contrario, sólo se realizará una copia si __array__ devuelve una copia, si obj es una secuencia anidada, o si se necesita una copia para satisfacer cualquiera de los otros requisitos (tipod, orden, etc.).

subok: booleano, opcional Si es Verdadero, las subclases se transferiránde 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 la matriz resultante debería tener. Los unos se antepondrán a la forma según sea necesario para cumplir con este requisito.

avatar de usuario
apagado99555

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

Usar asarray(x) cuando quieras asegurarte de que x será una matriz antes de que se realicen otras operaciones. Si x ya es una matriz, entonces no se haría ninguna copia. No causaría un impacto de rendimiento redundante.

Aquí hay un ejemplo de una función que asegura x se convierte primero en una matriz.

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

avatar de usuario
Vivek

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 usando un objeto diferente 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)

El contenido de la matriz (a) permanece intacto y, aún así, podemos realizar cualquier operación en los datos utilizando otro objeto sin modificar el contenido de la matriz original.

avatar de usuario
Haroon Hayat

Entendamos la diferencia entre np.array() y np.asarray() con el ejemplo:

np.matriz(): Convierte los datos de entrada (lista, tupla, matriz u otro tipo de secuencia) en un ndarray y copia los datos de entrada de forma predeterminada.

np.asarray(): Convierta los datos de entrada en un ndarray, pero no los copie si la entrada ya es un ndarray.

#Create an array...

arr = np.ones(5);  # array([1., 1., 1., 1., 1.])
#Now I want to modify `arr` with `array` method. Let's see...

arr = np.array(arr)[3] = 200;  # array([1., 1., 1., 1., 1.])

No hay cambios en la matriz porque estamos modificando una copia de la arr.

Ahora, modifica arr con asarray() método.

arr = np.asarray(arr)[3] = 200;  # array([1., 200, 1., 1., 1.])

El cambio ocurre en esta matriz porque ahora estamos trabajando con la matriz original.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad