Computer 4 dummy

Informatica facile a portata di tutti

Numpy – Liste vs. Array

Nel vasto panorama della programmazione in Python, l’utilizzo di NumPy si rivela fondamentale per gestire dati complessi in modo efficiente. In questo capitolo, esploreremo come NumPy consente di elevare il livello di manipolazione dei dati, concentrando la nostra attenzione sulla differenza tra le tradizionali liste di Python e gli array di NumPy: Liste vs. Array, chi vincerà?

L’indice del corso lo puoi trovare a questo Link: https://computer4dummy.altervista.org/programmazione-guide-alla-programmazione/numpy-per-python/

Partiamo importando il il pacchetto Numpy con il seguente comando:

import numpy as np

Le liste sono una struttura dati versatile in Python, consentendo di immagazzinare una serie di elementi di tipo eterogeneo o omogeneo.
Tuttavia, quando si tratta di manipolare dati numerici su larga scala, le liste possono rivelarsi meno efficienti rispetto agli array di NumPy.
In questo esempio vediamo come creare una lista L:

L = [1,2,3]

Creiamo ora un equivalente array, cioè una struttura dati più specializzata per gestire operazioni numeriche. Gli array NumPy offrono diversi vantaggi rispetto alle liste standard di Python:

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

Sia la lista che l’array A contengono gli stessi elementi, vediamo ora come gestirli diversamente all’interno di cicli e alcune operazioni.

for e in L:
    print e

1
2
3

Facciamo lo stesso per l’array

for e in A:
   print e

1
2
3

Il risultato è esattamente lo stesso.

Proviamo ad aggiungere un elemento alla lista:

L.append(4)
L

[1,2,3,4]

Proviamo a farlo con l’array

A.append(4)


  File "<ipython-input-10-7b48164c1d55>", line 1, in <module>
    A.append(4)

AttributeError: 'numpy.ndarray' object has no attribute 'append'

Il risultato è un errore dato che non esiste un metodo chiamato “append” per aggiungere un elemento ad un array.

Esiste un altro metodo per aggiungere un elemento ad una lista:

L = L + [5]
L

[1, 2, 3, 4, 5]

Proviamolo con l’array.

A = A + [4,5]

ValueError: operands could not be broadcast together with shapes (3,) (2,) 

Anche questo metodo non funziona per gli array, Facciamo ancora una prova con le liste creando una nuova L2:

L2 = []

for e in L:
    L2.append(e+e)
    

L2
Out[19]: [2, 4, 6, 8, 10]

Per ottenere lo stesso risultato con gli array è più semplice in quanto possiamo utilizzare gli operatori matematici di addizione, moltiplicazione ecc.

A+A
Out[20]: array([2, 4, 6])

oppure

2*A
Out[21]: array([2, 4, 6])

Proviamo a vedere cosa succede con le liste

2*L
Out[23]: [1, 2, 3, 4, 5, 1, 2, 3, 4, 5]

In sostanza la nostra lista viene ripetuta 2 volte. Per raddoppiarne il valore invece è necessario creare un loop e moltiplicare X 2 il singolo valore. Proviamo a fare un esempio con il quadrato della nostra lista.

L2 = []

for e in L:
    L2.append(e*e)
    

L2
Out[29]: [1, 4, 9, 16, 25]

Per il quadrato di un array invece.

A**2
Out[30]: array([1, 4, 9], dtype=int32)

Proviamo ora la radice quadrata

np.sqrt(A)
Out[32]: array([ 1.        ,  1.41421356,  1.73205081])

Proviamo ora con il logaritmo

np.log(A)
Out[33]: array([ 0.        ,  0.69314718,  1.09861229])

Ora proviamo con l’esponenziale

np.exp(A)
Out[34]: array([ 2.71828183, 7.3890561 , 20.08553692])

Abbiamo esplorato le operazioni di base che possiamo sfruttare sia con le liste che con gli array. Nel prossimo capitolo, approfondiremo ulteriormente, mettendo in luce i vantaggi distintivi dell’utilizzo di uno o dell’altro attraverso esempi pratici. Per scoprire come questi concetti si traducono in miglioramenti tangibili nelle prestazioni e nella gestione dei dati, non perdere il prossimo capitolo disponibile a questo LINK.