2011-11-21 19 views
20

¿Cuál es la diferencia entre un iterable y un objeto array_like en programas de Python que utilizan Numpy?Terminología: Python y Numpy - `` iterable` frente array_like`

Ambos iterable y array_like se ven a menudo en la documentación de Python y comparten algunas propiedades similares.

entiendo que en este contexto un objeto array_like debe apoyar operaciones de tipo Numpy como radiodifusión, sin embargo Numpy matrices en las cercanías también iterable. ¿Es correcto decir que array_like es una extensión (o superconjunto?) De iterable?

Respuesta

23

El término "array-like" solo se usa en NumPy y hace referencia a todo lo que se puede pasar como primer parámetro a numpy.array() para crear una matriz.

El término "iterable" es la terminología estándar de Python y se refiere a todo lo que se puede repetir (por ejemplo, usando for x in iterable).

La mayoría de los objetos tipo array son iterables, con la excepción de los tipos escalares.

Muchos iterables no son parecidos a una matriz; por ejemplo, no se puede construir una matriz NumPy a partir de una expresión generadora usando numpy.array(). (Debería usar numpy.fromiter() en su lugar. Sin embargo, una expresión de generador no es una "matriz" en la terminología de la documentación de NumPy.)

+0

Gran - gracias. Eso lo aclara, especialmente el vínculo entre 'array-like' y el primer arg de' numpy.array() '. – dtlussier

+0

"Todos los objetos tipo array son iterables" - esto no es correcto. El valor escalar del tipo '' 'int''' es parecido a una matriz y se puede pasar a' '' numpy.array() '' ', pero no es iterable. – wombatonfire

+0

@wombatonfire Sí, es cierto. Incluso las matrices reales de 0-d no se pueden iterar, mientras que son claramente "parecidas a una matriz". Incluso son arreglos. –

3

Si bien la primera parte de la respuesta de Sven es correcta, me gustaría para agregar que los objetos tipo array no necesariamente deben ser iterables.

Por ejemplo, en mi situación particular, estaba interesado en usar la función numpy.rint() que acepta objetos similares a una matriz con escalares del tipo int. No son iterables, pero son aceptados. También puede pasar int a numpy.array(), por lo que son parecidos a una matriz.

Aquí es la confirmación de la lista de correo "NumPy-Debate": https://mail.scipy.org/pipermail/numpy-discussion/2016-November/076224.html