Respuestas:
Desde otras preguntas están siendo redirigidos a esta que preguntar sobre asanyarray
o 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.
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 (vea Creación de matrices , pero brevemente, aquí hay algunos ejemplos:
Supongamos que a
es un ndarray
, y m
es un matrix
, y ambos tienen una 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 a
, porque 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 matrix
, que 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 de array
ese 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 ndarray
subclase compatible o 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 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 object
matriz con el iterador); siempre copiadoTambién hay funciones de conveniencia, como asarray_chkfinite
(las mismas reglas de copia que asarray
, pero aumenta ValueError
si hay alguno nan
o inf
valores), y constructores para subclases como matrix
o para casos especiales como matrices de registros y, por supuesto, el ndarray
constructor 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
. array
tiene copy=True
por defecto.
La principal diferencia es que array
(por defecto) hará una copia del objeto, mientras asarray
que 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.array
directamente en lugar de np.asarray
lo que enviaría el copy=False
parámetro np.array
. Se copy=False
ignora si se debe hacer una copia como sería en este caso. Si compara los dos usando %timeit
IPython, verá una diferencia para las listas pequeñas, pero no importa cuál use para las listas grandes.
np.asanyarray
?
asarray
siempre devuelve un ndarray
. asanyarray
devolverá una subclase de ndarray
si eso es lo que se le pasó. Por ejemplo, an np.matrix
es 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.array
para 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.asarray
para modificar A
. Funcionó porque está modificando A
propio
>>> 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 array
y 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 array
y 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 x
será una matriz antes de realizar cualquier otra operación. Si x
ya 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 x
se convierta primero en una matriz.
def mysum(x):
return np.asarray(x).sum()