Respuestas:
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 copiadoTambié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).
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.
array([1, 2, 3])o asarray([1, 2, 3])?
[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.
np.asanyarray?
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.
La diferencia se puede demostrar con este ejemplo:
generar una matriz
>>> A = numpy.matrix(numpy.ones((3,3)))
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])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.]])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!
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.
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.
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()