• Home
  • Chi sono
  • Risorse
  • Contatti
  • Approfondimenti
  • Cerca nel sito

Lorenzo Govoni

Business e Tecnologia

  • Big Data
  • Business
  • Excel
  • Intelligenza Artificiale

Come costruire e manipolare un array Numpy

numpy array

Nella creazione di modelli di machine learning spesso ci si trova a che fare con array numpy. 

Capire cosa sono e come funzionano permette di comprendere cosa sono le strutture dati su cui si avvale la libreria, come impostare correttamente la fase di preprocessamento dei dati e l’implementazione successiva degli algoritmi di machine learning.

In questo articolo vediamo come creare e lavorare con gli array numpy tramite alcune funzioni diffuse che numpy ci consente di utilizzare.

 

Cos’è Numpy?

NumPy deriva da Numerical Python ed è una libreria Python open source utilizzata in quasi tutti i campi della scienza e dell’ingegneria. È lo standard universale per lavorare con i dati numerici in Python ed è al centro degli ecosistemi scientifici Python e PyData.

Numpy permette di creare strutture dati dette array, e una serie di metodi e funzioni per operare in modo efficiente su di essi.

A differenza delle liste Python, gli array NumPy sono più veloci e più compatti. Un array consuma meno memoria ed è molto più comodo da usare. Inoltre, fornisce un meccanismo per specificare i tipi di dati, che consente di ottimizzare ulteriormente il codice.

 

Cos’è un array?

Come suggerisce il nome, un array NumPy è una struttura dati centrale della libreria numpy.

Viene rappresentato da una griglia di valori che contiene informazioni sui dati grezzi. Ogni valore all’interno dell’array viene detto elemento.

Quando si lavora con gli array diventa fondamentale l’indicizzazione dell’array: altro non è che la possibilità di avere accesso a un elemento dell’array facendo riferimento al suo numero di indice.

Gli indici negli array NumPy iniziano con 0, il che significa che il primo elemento ha indice 0 e il secondo ha indice 1 ecc.

Un array può essere indicizzato da una tupla di interi non negativi, da booleani, da un altro array o da interi.

Un altro aspetto importante di un array è la dimensione.

Occasionalmente potresti sentire un array denominato “ndarray“, che è l’abbreviazione di “array N-dimensionale”. Un array N-dimensionale è semplicemente un array con un numero qualsiasi di dimensioni.

Quando n è pari a 1 si ha un array 1-D o unidimensionale, se invece n è pari a 2, l’array è 2-D o bidimensionale e così via.

Un array è solitamente un contenitore di elementi dello stesso tipo e dimensione. Il numero di dimensioni ed elementi in un array è definito dalla sua forma, descritta come una tupla di numeri interi non negativi.

In NumPy, le dimensioni sono chiamate assi. Ciò significa che se si dispone di un array 2D simile a questo:

[[1 2 3]
[0 5 7]]

L’array ha 2 assi. Il primo asse, che indica il numero di righe dell’array, ha una lunghezza di 2 e il secondo asse ha una lunghezza di 3 (e indica il numero di colonne o il numero di elementi per singola riga dell’array).

 

Installare Numpy

Andiamo alla pratica e vediamo come installare numpy. ll modo più semplice per farlo è usare Pip, un gestore di pacchetti per l’installazione e utilizzo del software Python.

A differenza di Python, Pip non è preinstallato sulla maggior parte dei sistemi operativi. Pertanto, è necessario configurare il gestore di pacchetti che corrisponde alla versione di Python che si possiede (qua puoi trovare una guida passo passo per farlo in Windows).

Dopodichè una volta installato pip, è possibile installare numpy aprendo il promp dei comandi, posizionandosi nella cartella dove è installo python e digitare il seguente comando:

pip install numpy

Un altro modo per installare numpy è installare Anaconda, che include già la libreria al suo interno.

 

Importare Numpy

Entriamo nel vivo e vediamo come utilizzare numpy. Come prima cosa dobbiamo importarlo digitando il seguente comando in python (o in altre applicazioni come Jupyter Notebook):

import numpy as np

Creare un array

Siamo pronti per creare un semplice array. La funzione da utilizzare in questo caso è numpy.array().

Ad esempio se vogliamo creare un array monodimensionale composto dagli elementi 0 1 e 2, dopo aver importato la libreria numpy dobbiamo digitare l’istruzione indicata nell’immagine seguente:

Oltre a creare un array da una sequenza di elementi, puoi facilmente creare un array di 0 tramite la funzione numpy.zeros(), col numero di elementi indicato dentro parentesi:

Il risultato sarà il seguente:

Se volessimo creare array di uno, il comando da utilizzare è numpy.ones() e tra parentesi il numero di 1 che dovrà essere presente nell’array:

Per creare un array con una serie di elementi ordinati puoi utilizzare la funzione numpy.arange(), indicando tra parentesi il numero di elementi che ti servono. Nell’esempio successivo creo un array con i primi 5 numeri interi partendo da 0:

 

Aggiunta, rimozione e ordinamento di elementi

Per aggiungere un elemento all’array possiamo utilizzare il metodo numpy.append():

All’array ar5 [0,1,2,3,4] verranno aggiunti i valori 7 e 8:

Al contrario è possibile eliminare un elemento con np.delete(). Se vuoi eliminare l’elemento nella posizione 3 del tuo array, puoi eseguire:

Il primo argomento della funzione è un array già esistente, il secondo indica l’indice da eliminare dall’array scelto nel primo argomento. Maggiori informazioni puoi trovarle alla pagina dedicata di numpy.

Per un array non ordinato è possibile utilizzare il comando numpy.sort() per ordinare gli elementi al suo interno:

E come risultato otteniamo:

Dimensione di un array

Come abbiamo accennato in precedenza, quando si inizia a lavorare con gli array un attributo rilevante rappresenta la dimensione. Numpy ci dà una serie di metodi per definirla. I più importanti sono:

  • ndim(): ti dirà il numero di assi, o dimensioni, dell’array. Ad esempio, per il seguente array:

Ho una dimensione pari a 3:

  • size(): ti dirà il numero totale di elementi dell’array. Questo è il prodotto degli elementi della forma della matrice.

  • shape(): mostrerà una tupla di numeri interi che indicano il numero di elementi memorizzati lungo ogni dimensione dell’array. Passando il parametro shape[0], verrà restituito il numero di righe dell’array (3), mentre shape[1] il numero di colonne dell’array (2).

 

Differenza tra matrice e array

Gli oggetti matrice sono una sottoclasse degli array numpy (ndarray) e quindi ereditano tutti gli attributi e i metodi di ndarray. La differenza fondamentale tra le matrici e gli array in numpy è che le matrici numpy sono rigorosamente bidimensionali (quindi a 2 dimensioni), mentre gli array numpy possono essere di qualsiasi dimensione, cioè sono n-dimensionali.

Nell’esempio precedente ar10 è un array a 3 dimensioni. Una matrice numpy potrebbe essere la seguente:

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

Indexing e Slicing

Così come per le liste è possibile indicizzare e suddividere gli array Numpy estraendo solo alcuni dati da essi.

Ad esempio volendo estrarre solo la prima riga dell’array ar10, è possibile richiamare l’indice zero:

Volendo estrarre la seconda riga dell’array si può utilizzare l’indice 1:

È possibile estrarre anche più array contemporaneamente suddividendo l’indice iniziale da quello finale con i due punti. Partendo da 0 a 2 vengono estratte solo le prime due righe delle tre dell’array ar10:

In aggiunta è possibile estrarre anche tutti i valori di un array secondo certe condizioni. Nell’ipotesi di voler visualizzare tutti i valori maggiori di 4 si può indicare dentro l’array la condizione di estrazione:

Oppure puoi selezionare elementi che soddisfano due condizioni usando gli operatori and e or:

In alternativa puoi utilizzare il metodo numpy.where() per ottenere e selezionare elementi o indici di un array.

L’unica differenza rispetto a prima è che in questo modo otteniamo come risultato una tupla di array, una per ogni dimensione (per maggiore comprensione riporto ar10, l’array originale):

In questo esempio, il primo elemento della tupla rappresenta l’indice di riga dove si trova il numero maggiore di 4, il secondo elemento rappresenta l’indice di colonna in cui si trovano i valori maggiori di 4, mentre il terzo elemento rappresenta l’indice di colonna di ogni singolo array monodimensionale in cui si trovano i valori.

Come puoi vedere [0,0,0,1,1,1,2,2,2,2,2,2] corrisponde a [15,8,7,5,9,8,46,25,18,11,17,16], ossia tutti i numeri dell’array maggiori di 4.

Per intenderci [15,8,2] e [3,7,4] corrispondono all’indice di riga 0, [5,9,1], [4,2,8] all’indice di riga 1 mentre [46,25,18], [11,17,16] all’indice di riga 2.

L’array [0,0,1,0,0,1,0,0,0,1,1,1] corrisponde nuovamente a [15,8,7,5,9,8,46,25,18,11,17,16]. Essi indicano se si trovano nella prima (indice 0) o seconda (indice 1) colonna. [15,2,8], [5,9,1] e [46,25,18] si trovano nell’indice di colonna 0, mentre [3,7,4], [4,2,8] e [11,17,16] nell’indice di colonna 1.

Infine il 3° elemento della tupla [0,2,1,0,1,2,0,120,1,2] corrisponde sempre a [15,8,7,5,9,8,46,25,18,11,17,16].

[15,2,8] è il primo array a una dimensione. 15 è in posizione 0, 2 è in posizione 1 mentre 8 è in posizione 2. E così vale anche per tutti gli altri array contenuti in ar10. Il terzo elemento della tupla calcola in questo modo l’indice di colonna dell’array, per ogni singolo array monodimensionale.

 

Operazioni di base sugli array

Dopo aver creato i tuoi array, puoi iniziare a lavorarci. Supponiamo, ad esempio, che tu abbia creato due array, uno chiamato “x” e uno chiamato “y” entrambi con 3 elementi:

Come con due numeri, è possibile sommare due array. Il risultato del primo elemento dell’array (z[0]) sarà dato dalla somma del primo elemento del primo array con il primo elemento del secondo array, e così via per gli altri elementi.

Allo stesso modo è possibile eseguire una differenza tra i due array y e x:

Anche il prodotto è un’operazione eseguibile tra due array.

Pure la divisione è possibile eseguire tra due array:

Le operazioni di base sono semplici con NumPy. Se ti interessa trovare la somma degli elementi in un array, dovresti usare sum(). Questo funziona per array 1D, array 2D e array di dimensioni superiori.

Ad esempio:

Sommando i valori di x otterrò 6 (1+2+3):

E allo stesso modo la somma di y sarà pari a 15 (4+5+6):

Per aggiungere le righe o le colonne in una matrice 2D è fondamentale specificare l’asse.

Se inizi con un array a due dimensioni, e vuoi sommare le righe, nel metodo sum() devi specificare il parametro axis = 0:

6 è dato da 2 + 4 mentre 9 da 5 + 4.

Se vuoi sommare le colonne devi specificare axis = 1:

7 è dato dalla somma di 2 e 5 mentre 8 da 4 e 4.

 

NumPy Broadcasting

In alcune situazioni è possibile dover lavorare con unità di misura differenti in array e dover fare operazioni aritmetiche tra di esse. In questi contesti si può utilizzare Numpy Broadcasting.

Ad esempio può succedere di avere dei dati in metri (dentro un array) e doverli trasformare in kilometri (km). Per farlo occorre dividere per 1000 tutti i valori dentro l’array in metri:

NumPy capisce che la divisione dovrebbe avvenire con ogni elemento. Il Broadcasting consente a NumPy di ​​eseguire operazioni su array di forme diverse.

Un prerequisito per cui ciò funziona è che le dimensioni dell’array siano compatibili: ad esempio, quando le dimensioni di entrambi gli array sono uguali o quando una di esse è 1. Se le dimensioni non sono compatibili, verrà visualizzato un errore di valore.

Massimo e minimo elemento in un array

E’ possibile ricavare il massimo elemento di un array semplicemente utilizzando numpy.max().

Allo stesso modo per il minimo è possibile utilizzare numpy.min().

Esistono anche altre funzioni come numpy.mean() per calcolare la media degli elementi di un array, numpy.devstd() per calcolare la deviazione standard degli elementi di un array e altre funzioni di aggregazione dove la libreria può venirci in aiuto.

 

Generare array random

Quando vuoi generare un array composto da numeri random hai diverse opzioni in NumPy.

Ad esempio, con NumPy.random.Generator.integers() puoi generare numeri interi casuali da valore minimo (incluso) a valore massimo (escluso).

È possibile impostare endpoint = True per includere il numero massimo random da poter includere. Nell’esempio successivo estraggo in un array di dimensione 3×5 numeri casuali da 0 a 10 (incluso).

Un altro metodo per generare numeri casuali è quello di utilizzare numpy.random.random(), che restituisce numeri inclusi tra 0 e 1 (quest’ultimo valore però escluso), secondo una distribuzione uniforme continua:

 

Array inverso

Un altro metodo che può venire in aiuto quando si lavora con gli array numpy è numpy.flip().

Questa funzione ti consente di capovolgere o invertire il contenuto di un array lungo un asse. Diventa rilevante specificare l’array che si desidera invertire e l’asse. In caso contrario, se non specifichi l’asse, NumPy invertirà il contenuto lungo tutti gli assi del tuo array di input, come nel seguente esempio:

 

Elementi unici in un array

Qualora si è interessati ad estrarre gli elementi unici (per evitare i doppi) di un array numpy è possibile avvalersi del metodo numpy.Unique().

Ad esempio il seguente array ar12:

È composto da diversi duplicati. Per estrarre una volta sola gli elementi unici, basta utilizzare np.unique(ar12):

Trasporre e rimodellare una matrice

Quando si lavora con le matrici è normale che sia necessario dover invertire le righe con le colonne. Gli array NumPy hanno la proprietà T che ti permette di trasporre una matrice, tramite il metodo numpy.transpose().

La particolarità di questo metodo è che consente di invertire il numero di righe col numero di colonne, quindi se ad esempio ho una matrice 3×2 (3 righe e 2 colonne) sono in grado di trasformarla in una 2×3 (2 righe e 3 colonne).

Verosimilmente se trasponiamo l’array ar13, che ha dimensione 2×3, otteniamo una matrice 3×2:

Potrebbe anche essere necessario cambiare le dimensioni di una matrice. Ciò può accadere quando, ad esempio, si dispone di un modello che prevede una determinata forma di input diversa dal set di dati. È qui che il metodo numpy.reshape() può essere utile. Devi semplicemente passare le nuove dimensioni che desideri per la matrice.

Il primo reshape genera una matrice 2×3:

Mentre il secondo una 3×2:

Infine un ultimo metodo che vediamo è numpy.ndarray.flatten(). Con questo metodo è possibile comprimere a una dimensione l’array che si sta utilizzando. Per una maggiore comprensione pensa all’array seguente:

L’array originale

Viene compresso fino a una dimensione:

Utilizzando flatten l’array ottenuto è una copia compressa del padre ma è indipendente da quest’ultimo. Ciò significa che qualsiasi modifica effettuata all’array compresso (ar16) non ricadrà sull’array padre (ar15).

Se si vuole che le modifiche vengono apportate anche all’array originale si può utilizzare il metodo numpy.ravel(), al posto di numpy.ndarray.flatten().

 

Conclusione

In questo articolo abbiamo visto cos’è numpy e alcune delle funzioni più utilizzate da chi utilizza questa libreria per utilizzare gli array.

Numpy può essere utilizzato per eseguire una serie di operazioni matematiche su array come routine trigonometriche, statistiche e algebriche grazie al gran numero di funzioni matematiche e di trasformazione che possiede al suo interno.

È in grado di lavorare bene con altre librerie come Pandas e MatplotLib e con l’ecosistema python Scipy, oltre che essere un ottimo sostituto di Matlab od Octave.

Non è un caso se è uno strumento molto utilizzato che fornisce funzionalità e supporti simili con uno sviluppo rapido per eseguire l’analisi dei dati e per implementare facilmente modelli di machine learning.

  • Introduzione alla Linear Discriminant Analysis (LDA)
    Introduzione alla Linear Discriminant Analysis (LDA)
  • Chatbot: lo strumento per incrementare le vendite del tuo business
    Chatbot: lo strumento per incrementare le vendite…
  • Cos'è l'Intelligenza Artificiale e perchè se ne parla tanto
    Cos'è l'Intelligenza Artificiale e perchè se ne parla tanto
  • Regressione lineare multipla: modello ed esempio di applicazione
    Regressione lineare multipla: modello ed esempio di…
Share
Pin
Share
Tweet

Intelligenza Artificiale Machine Learning, Python

  • Home
  • Archivio
  • Risorse
  • Newsletter
  • Cerca nel sito

Copyright © 2021 · Lorenzo Govoni - Privacy Policy