¿Cuál es la diferencia entre ndarray y array en numpy?

Respuestas:

221

numpy.arrayes solo una función conveniente para crear un ndarray; No es una clase en sí misma.

También puede crear una matriz usando numpy.ndarray, pero no es la forma recomendada. De la cadena de documentación de numpy.ndarray:

Las matrices deben construirse usando array, zeroso empty... Los parámetros dados aquí se refieren a un método de bajo nivel ( ndarray(...)) para crear instancias de una matriz.

La mayor parte de la carne de la implementación está en el código C, aquí en multiarray , pero puede comenzar a mirar las interfaces ndarray aquí:

https://github.com/numpy/numpy/blob/master/numpy/core/numeric.py

wim
fuente
1
Creo que array () está implementado en core / src / multiarray / method.c en array_getarray ().
flxb
66
Esto puede morderte si olvidas que np.arrayno es una clase, como a menudo hago. x = np.array([1,2.1,3]) if isinstance(x,np.array): # will give you a TypeError
Steve L
44
Todavía no tengo idea de por qué debería evitar usar ndarray? Porque es de bajo nivel?
GabrielChu
@flxb: No, array_getarrayes la implementación de numpy.ndarray.__array__. numpy.arraycomienza en _array_fromobject, al menos en la implementación actual.
user2357112 es compatible con Monica el
2
Entonces, ¿por qué no se recomienda?
NoName
48

numpy.arrayes una función que devuelve a numpy.ndarray. No hay ningún tipo de objeto numpy.array.

Ramón J Romero y Vigil
fuente
31

Solo unas pocas líneas de código de ejemplo para mostrar la diferencia entre numpy.array y numpy.ndarray

Paso de calentamiento: construir una lista

a = [1,2,3]

Comprueba el tipo

print(type(a))

Conseguirás

<class 'list'>

Construya una matriz (de una lista) usando np.array

a = np.array(a)

O bien, puede omitir el paso de calentamiento, directamente tener

a = np.array([1,2,3])

Comprueba el tipo

print(type(a))

Conseguirás

<class 'numpy.ndarray'>

que te dice que el tipo de matriz numpy es numpy.ndarray

También puede verificar el tipo por

isinstance(a, (np.ndarray))

y obtendrás

True

Cualquiera de las dos líneas siguientes le dará un mensaje de error

np.ndarray(a)                # should be np.array(a)
isinstance(a, (np.array))    # should be isinstance(a, (np.ndarray))
Ying
fuente
4

numpy.ndarray()es una clase, mientras que numpy.array()es un método / función para crear ndarray.

En numpy docs, si desea crear una matriz a partir de la ndarrayclase, puede hacerlo de 2 maneras como se cita:

1- usando array(), zeros()o empty()métodos: Las matrices deben construirse usando una matriz, ceros o vacíos (consulte la sección Vea también a continuación). Los parámetros dados aquí se refieren a un método de bajo nivel ( ndarray(…)) para crear instancias de una matriz.

2- de la ndarrayclase directamente: hay dos modos de crear una matriz usando __new__: Si el búfer es Ninguno, entonces solo se utilizan forma, tipo y orden. Si el búfer es un objeto que expone la interfaz del búfer, se interpretan todas las palabras clave.

El siguiente ejemplo proporciona una matriz aleatoria porque no asignamos valor de búfer:

np.ndarray(shape=(2,2), dtype=float, order='F', buffer=None)

array([[ -1.13698227e+002,   4.25087011e-303],
       [  2.88528414e-306,   3.27025015e-309]])         #random

otro ejemplo es asignar un objeto de matriz al ejemplo del búfer:

>>> np.ndarray((2,), buffer=np.array([1,2,3]),
...            offset=np.int_().itemsize,
...            dtype=int) # offset = 1*itemsize, i.e. skip first element
array([2, 3])

del ejemplo anterior notamos que no podemos asignar una lista a "buffer" y tuvimos que usar numpy.array () para devolver el objeto ndarray para el buffer

Conclusión: úsala numpy.array()si quieres hacer un numpy.ndarray()objeto "

Mahmoud Elshahat
fuente
0

Creo que con np.array()usted solo puede crear C como si mencionara el orden, cuando verifica que usarlo np.isfortran()dice falso. pero con np.ndarrray()cuando especifica el orden que crea en función del orden proporcionado.

Sujith Rao
fuente