Arrotondamento Ufunc NumPy

Quando si lavora con gli array in Python, prima o poi si presenta un’esigenza molto comune: arrotondare i numeri in modo rapido, ordinato e coerente. In questo contesto, NumPy mette a disposizione diverse ufunc, cioè funzioni universali progettate per operare in maniera efficiente su array e matrici.

L’arrotondamento in NumPy è particolarmente utile nell’analisi dei dati, nel calcolo scientifico, nella visualizzazione di risultati numerici e nella pulizia dell’output. Anche chi è alle prime armi può iniziare subito a usare queste funzioni, perché la sintassi è piuttosto lineare e il comportamento è prevedibile nella maggior parte dei casi.

In questa guida vedremo quali sono le principali funzioni di arrotondamento NumPy, come indicare il numero di decimali e alcuni esempi pratici che aiutano a capire quando usare una funzione invece di un’altra.

Le principali funzioni di arrotondamento in NumPy

NumPy offre più di una funzione per arrotondare i valori. Questo è importante, perché non esiste un solo tipo di arrotondamento: in alcuni casi serve il valore intero più vicino, in altri si vuole sempre salire o sempre scendere.

La funzione più conosciuta è numpy.round(), chiamata spesso anche np.round(). Serve per arrotondare ogni elemento di un array al numero di cifre desiderato.

import numpy as np

valori = np.array([1.234, 5.678, 9.876])

risultato = np.round(valori)

print(risultato)

In questo caso, ogni numero viene arrotondato all’intero più vicino. Il risultato sarà un nuovo array con i valori arrotondati.

Accanto a np.round(), ci sono anche altre funzioni molto utilizzate:

  • np.floor(): arrotonda sempre per difetto
  • np.ceil(): arrotonda sempre per eccesso
  • np.trunc(): rimuove la parte decimale
  • np.rint(): arrotonda al numero intero più vicino, in modo simile a round

Ecco un confronto semplice:

import numpy as np

valori = np.array([2.9, 2.1, -2.9, -2.1])

print(np.floor(valori))
print(np.ceil(valori))
print(np.trunc(valori))
print(np.rint(valori))

Queste funzioni diventano molto comode quando si ha a che fare con array numerici di grandi dimensioni, perché permettono di applicare l’operazione a tutti gli elementi in una sola istruzione, senza usare cicli manuali.

Come scegliere la funzione di rounding più adatta

La scelta dipende dal risultato che vuoi ottenere:

  • usa np.round() se ti serve un arrotondamento classico;
  • usa np.floor() se vuoi scendere sempre al numero inferiore;
  • usa np.ceil() se vuoi salire sempre al numero superiore;
  • usa np.trunc() se ti basta eliminare i decimali senza vero arrotondamento.

È utile ricordare che il comportamento con i numeri negativi cambia molto tra una funzione e l’altra. Proprio per questo conviene fare qualche prova pratica, soprattutto se stai preparando dati per report, grafici o modelli numerici.

Impostare il numero di cifre decimali con NumPy

Uno degli aspetti più interessanti di np.round() è la possibilità di specificare il numero di decimali da mantenere. Questo si fa passando un secondo argomento alla funzione.

import numpy as np

valori = np.array([3.14159, 2.71828, 1.61803])

arrotondati = np.round(valori, 2)

print(arrotondati)

Con il valore 2, NumPy conserva due cifre dopo la virgola. È una soluzione molto utile quando si vogliono presentare risultati più leggibili o uniformare un insieme di dati.

Si possono usare anche valori negativi per arrotondare a sinistra della virgola, ad esempio alle decine o alle centinaia.

import numpy as np

valori = np.array([123, 567, 891])

arrotondati = np.round(valori, -1)

print(arrotondati)

In questo caso, i numeri vengono arrotondati alla decina più vicina. È una possibilità spesso sottovalutata, ma molto pratica quando si lavora con grandi quantità o dati aggregati.

Dettagli utili sul parametro decimals

Il parametro decimals controlla con precisione il livello di arrotondamento:

  • 0 arrotonda all’intero più vicino;
  • 2 mantiene due decimali;
  • -1 arrotonda alle decine;
  • -2 arrotonda alle centinaia.

Questo rende NumPy round molto flessibile, sia per semplici output leggibili sia per operazioni preparatorie su dataset più ampi.

Esempi pratici di arrotondamento con NumPy

Per capire davvero come funziona l’arrotondamento in NumPy, conviene osservare alcuni scenari concreti. In questo modo è più facile collegare la teoria al lavoro quotidiano con dati e array.

Arrotondare i prezzi in un array

Immaginiamo di avere una serie di prezzi con molte cifre decimali e di volerli mostrare con due decimali, come avviene normalmente in un contesto commerciale.

import numpy as np

prezzi = np.array([12.499, 3.4567, 99.999])

prezzi_finali = np.round(prezzi, 2)

print(prezzi_finali)

Questo approccio è molto utile quando si preparano dati per tabelle, dashboard o esportazioni.

Arrotondare sempre per eccesso

In alcuni casi, come il calcolo di pacchi, unità minime o soglie, può essere più corretto arrotondare sempre verso l’alto.

import numpy as np

quantita = np.array([1.2, 2.01, 4.8])

quantita_intere = np.ceil(quantita)

print(quantita_intere)

Con np.ceil(), anche un valore appena superiore all’intero viene portato al numero successivo.

Eliminare la parte decimale senza arrotondare

Se vuoi semplicemente tagliare i decimali, senza modificare la parte intera, puoi usare np.trunc().

import numpy as np

misure = np.array([7.9, 4.2, -3.8])

misure_troncate = np.trunc(misure)

print(misure_troncate)

Questa funzione è diversa da np.floor() e np.ceil(), soprattutto quando entrano in gioco valori negativi.

Applicare l’arrotondamento a una matrice NumPy

Le ufunc di NumPy non lavorano solo su array monodimensionali. Possono essere usate senza problemi anche su matrici.

import numpy as np

matrice = np.array([[1.2345, 2.3456], [3.4567, 4.5678]])

matrice_arrotondata = np.round(matrice, 3)

print(matrice_arrotondata)

Questo è uno dei motivi per cui NumPy è così apprezzato: permette di applicare trasformazioni numeriche in modo uniforme, elegante e molto veloce.

Corsi correlati

Design Pattern per videogiochi

I Design Pattern sono soluzioni a problemi comuni che si incontrano nello sviluppo del software. Nel contesto dei videogiochi, questi pattern possono aiutare a gestire la complessità crescente dei giochi moderni. Sei appassionato di videogiochi? Hai mai pensato a come vengono progettati e sviluppati? Sei curioso di scoprire i segreti dietro la creazione dei tuoi giochi preferiti? Allora sei nel posto giusto! Questo corso è stato progettato per fornirti una solida comprensione dei Design Pattern, strumenti fondamentali per ogni sviluppatore di giochi. Attraverso esempi pratici e realistici, esploreremo insieme come questi pattern possono aiutarti a creare giochi più efficienti, flessibili e mantenibili.

Corso Fondamenti di Python

Python, uno dei linguaggi di programmazione più popolari al mondo, è ampiamente utilizzato da colossi dell’informatica e della tecnologia come Google, la Nasa e Mozilla.
Questo corso sui fondamenti di Python esplorerà le ragioni del suo successo duraturo. Impareremo la potente ed espressiva sintassi di Python, che consente di ottenere risultati impressionanti con poche righe di codice.

Blender Masterclass 2

I paesaggi, in generale, possono risultare intimidatori data la loro complessità, costituita da numerosi elementi che sembrano formare qualcosa di virtualmente infinito. Durante le lezioni di questo corso, ci concentreremo su una scomposizione delle diverse fasi coinvolte nella creazione di una scena, affrontandole una alla volta attraverso passi graduati.

Blender Masterclass 1

In questo corso di Blender 3D, Masha, in collaborazione con Gedemy, vi mostrerà il processo di modellazione, UV mapping, shading, e texture painting di un asset. Una volta apprese le basi, vedremo anche come effettuare il baking delle textures e la preparazione con successivo export della mesh in modo che possa essere utilizzabile all’interno di un qualsiasi altro software.

Crea il tuo account gratuito Gedemy

Gedemy è la prima piattaforma di formazione italiana che ti permette di sviluppare competenze in ambiti come Game Design, Programming, Arte, 3D, Tech, AI e molto altro.