2011-11-21 18 views
20

Qual è la differenza tra un iterable e un oggetto array_like in programmi Python che usano Numpy?Terminologia: Python e Numpy - `iterable` versus` array_like`

Entrambe iterable e array_like sono spesso visualizzate nella documentazione di Python e condividono alcune proprietà simili.

Comprendo che in questo contesto un oggetto array_like deve supportare le operazioni di tipo Numpy come broadcasting, tuttavia l'area di array Numpy può essere iterabile. È corretto dire che array_like è un'estensione (o super-set?) Di iterable?

risposta

23

Il termine "array-like" viene effettivamente utilizzato solo in NumPy e fa riferimento a tutto ciò che può essere passato come primo parametro a numpy.array() per creare un array.

Il termine "iterable" è una terminologia python standard e si riferisce a qualsiasi cosa possa essere iterata (ad esempio utilizzando for x in iterable).

La maggior parte degli oggetti tipo array sono iterabili, ad eccezione dei tipi scalari.

Molti iterabili non sono come una matrice, ad esempio non è possibile costruire una matrice NumPy da un'espressione di generatore utilizzando numpy.array(). (Dovresti usare invece numpy.fromiter(). Tuttavia, un'espressione di generatore non è un "array" nella terminologia della documentazione di NumPy.)

+0

Grande - grazie. Questo lo chiarisce, specialmente il collegamento tra 'array-like' e il primo argomento di' numpy.array() '. – dtlussier

+0

"Tutti gli oggetti di tipo array sono iterabili" - questo non è corretto. Il valore scalare di '' 'int''' è array-like e può essere passato a' '' numpy.array() '' ', ma non è iterable. – wombatonfire

+0

@wombatonfire Sì, è vero. Anche gli array 0-d effettivi non possono essere iterati, mentre sono chiaramente "array-like". Sono anche array. –

3

Mentre la prima parte della risposta di Sven è corretta, vorrei per aggiungere che gli oggetti tipo array non dovrebbero essere necessariamente iterabili.

Ad esempio, nella mia situazione particolare ero interessato all'utilizzo della funzione numpy.rint() che accetta oggetti di tipo array con scalari di tipo int. Non sono iterabili, ma sono accettati. È anche possibile passare int s a numpy.array(), quindi essi sono tipo.

Ecco la conferma dalla mailing list "NumPy-Discussione": https://mail.scipy.org/pipermail/numpy-discussion/2016-November/076224.html