web-dev-qa-db-fra.com

comment arrondir tableau numpy?

J'ai un tableau numpy quelque chose comme ci-dessous:

data = [  1.60130719e-01,   9.93827160e-01,   3.63108206e-04]
np.around(data,2) # doesn't work any alternatives ?

Je veux obtenir 2 décimales pour les valeurs ci-dessus.

Je vois np.around, cela fonctionne pour une valeur unique mais pas un tableau entier.

Est-il facile de contourner numpy ou dois-je écrire ma propre fonction avec np.around?

Update-Array n'était pas un tableau np, après avoir importé comme np.array, cela fonctionne.

22
ajayramesh

Vous pouvez utiliser soit

np.round(data, 2)

ou

np.around(data, 2)

comme ils sont équivalents.


Le round documentation pointe vers le documentation pour around :

numpy.around(a, decimals=0, out=None)

Arrondir uniformément au nombre de décimales donné.


La raison pour laquelle vous pensez que les méthodes ci-dessus ne fonctionnent pas est la façon dont vous avez importé numpy. Dans votre premier exemple, vous définissez arrays avec seulement array(...). Cependant, vous essayez ensuite d'utiliser np.round(...)!

Vous devez vous attacher à importer toutes les méthodes dans l'espace de noms global avec *; ou utilisez de préférence le standard de documentation en important en tant que np:

from numpy import *  #bad
import numpy as np   #good

Si vous essayez d'échanger entre np.some_func(...) et juste some_func(...) dans un code différent, vous allez créer beaucoup de confusion. Importer en tant que np est la voie à suivre.


Références:

25
Joe Iddon

Si vous voulez que la sortie soit

array([1.6e-01, 9.9e-01, 3.6e-04])

le problème n'est pas vraiment une caractéristique manquante de NumPy, mais plutôt que ce type d'arrondissement n'est pas chose courante à faire. Vous pouvez créer votre propre fonction d'arrondi qui permet d'obtenir ceci de la manière suivante:

def my_round(value, N):
    exponent = np.ceil(np.log10(value))
    return 10**exponent*np.round(value*10**(-exponent), N)

Pour une solution générale traitant 0 et les valeurs négatives aussi, vous pouvez faire quelque chose comme ceci:

def my_round(value, N):
    value = np.asarray(value).copy()
    zero_mask = (value == 0)
    value[zero_mask] = 1.0
    sign_mask = (value < 0)
    value[sign_mask] *= -1
    exponent = np.ceil(np.log10(value))
    result = 10**exponent*np.round(value*10**(-exponent), N)
    result[sign_mask] *= -1
    result[zero_mask] = 0.0
    return result
3
jmd_dk