Skip to content

NumPy: Arrotondare per eccesso o per difetto gli elementi di un ndarray (np.floor, trunc, ceil)

Python

È possibile utilizzare np.floor(), np.trunc(), np.ceil(), ecc. per arrotondare per eccesso e per difetto gli elementi di un array NumPy ndarray.

Quando si ottiene valori negativi, quattro esistono tipi di arrotondamento per eccesso e per difetto.

In questo articolo vengono descritti i seguenti contenuti.

  • Arrotonda per difetto (= arrotondato verso l’infinito negativo):np.floor()
  • Arrotonda verso zero:np.trunc(), np.fix(), cast to int
  • Arrotonda per eccesso (= arrotondato verso l’infinito positivo):np.ceil()
  • Rotonda verso l’infinito

Si noti che np.rint() e np.around() vengono utilizzati per arrotondare a pari.

Vedere l’articolo seguente per arrotondare per eccesso o per difetto i punti decimali usando la matematica della libreria Python standard.

Il seguente numpy.ndarray viene utilizzato nel codice di esempio.

import numpy as np

print(np.__version__)
# 1.19.4

a = np.array([[10.0, 10.1, 10.9], [-10.0, -10.1, -10.9]])
print(a)
# [[ 10.   10.1  10.9]
#  [-10.  -10.1 -10.9]]

Arrotonda per difetto (= arrotondato verso l’infinito negativo):np.floor()

Usa np.floor() per arrotondare all’infinito negativo.

print(np.floor(a))
# [[ 10.  10.  10.]
#  [-10. -11. -11.]]

print(np.floor(a).dtype)
# float64

Si noti che il tipo di dati del valore restituito è ancora un numero a virgola mobile float. Se vuoi convertirlo in un intero int, usa astype(). Lo stesso vale per np.trunc(), np.ceil(), ecc. descritti di seguito.

print(np.floor(a).astype(int))
# [[ 10  10  10]
#  [-10 -11 -11]]

È anche possibile specificare un valore scalare. Lo stesso vale anche per np.trunc(), np.ceil(), ecc.

print(np.floor(10.1))
# 10.0

Arrotonda verso zero:np.trunc(), np.fix(), cast to int

Usa np.trunc() per arrotondare a zero.

print(np.trunc(a))
# [[ 10.  10.  10.]
#  [-10. -10. -10.]]

Anche np.fix() arrotonda a zero.

print(np.fix(a))
# [[ 10.  10.  10.]
#  [-10. -10. -10.]]

Anche il cast del tipo di dati da un numero a virgola mobile float a un intero int con astype() viene arrotondato a zero.

print(a.astype(int))
# [[ 10  10  10]
#  [-10 -10 -10]]

Arrotonda per eccesso (= arrotondato verso l’infinito positivo):np.ceil()

Usa np.ceil() per arrotondare all’infinito positivo.

print(np.ceil(a))
# [[ 10.  11.  11.]
#  [-10. -10. -10.]]

Rotonda verso l’infinito

A partire da NumPy 1.20, non viene fornita alcuna funzione per l’arrotondamento all’infinito. Ad esempio, può essere fatto come segue.

print(np.copysign(np.ceil(np.abs(a)), a))
# [[ 10.  11.  11.]
#  [-10. -11. -11.]]

Il ndarray originale viene convertito in un valore assoluto con np.abs(), arrotondato per eccesso con np.ceil() e restituito al suo segno originale con np.copysign().