これを検索してみましたが、満足のいく答えが見つかりません。
数値のリスト/配列を取り、それらをすべて n 有効数字に丸めたいと思います。これを行う関数を作成しましたが、標準的な方法があるかどうか疑問に思っていましたか? 探したけど見つからない。例:
In: [ 0.0, -1.2366e22, 1.2544444e-15, 0.001222 ], n=2
Out: [ 0.00, -1.24e22, 1.25e-15, 1.22e-3 ]
ありがとう
numpy.set_printoptions はあなたが探しているものですか?
import numpy as np
np.set_printoptions(precision=2)
print np.array([ 0.0, -1.2366e22, 1.2544444e-15, 0.001222 ])
与えます:
[ 0.00e+00 -1.24e+22 1.25e-15 1.22e-03]
編集:
データを変換しようとしている場合、numpy.aroundはこの問題の側面を解決するようです。ただし、指数が負の場合は、期待どおりの結果が得られません。
あなたが持っている数値の例から、小数点以下ではなく有効数字を意味していると思います(小数点-1.2366e22
以下0桁まではまだ-1.2366e22
です)。
このコードは私にとってはうまくいきますが、組み込み関数が必要だといつも思っていました:
def Round_To_n(x, n):
return round(x, -int(np.floor(np.sign(x) * np.log10(abs(x)))) + n)
>>> Round_To_n(1.2544444e-15,2)
1.25e-15
>>> Round_To_n(2.128282321e3, 6)
2130.0
指数表記の (表示) 書式設定では、numpy.format_float_scientific(x, precision = n)
( xは書式設定する数値) うまく機能するようです。メソッドは を返しますstring
。(これは@秋の答えに似ています)
次に例を示します。
>>> x = 7.92398e+05
>>> print(numpy.format_float_scientific(x, precision = 3))
7.924e+05
ここで、引数precision = nは、仮数部の小数点以下の桁数を固定します (四捨五入により)。これをfloat
型に再変換することは可能です...そして、それは明らかに文字列に存在する数字だけを保持します。ただし、位置浮動小数点形式に変換されます...さらに作業が必要になるため、再変換は、多数の数値セットではおそらくかなり悪い考えだと思います。
また、これはイテラブルでは機能しません...詳細についてはドキュメントを参照してください。
うまく機能するもう1つのソリューション。@ScottGigante からのテストを行うと、1.75 ミリ秒のタイミングで次善の策になります。
import math
def sig_dig(x, n_sig_dig = 5):
num_of_digits = len(str(x).replace(".", ""))
if n_sig_dig >= num_of_digits:
return x
n = math.floor(math.log10(abs(x)) + 1 - n_sig_dig)
result = round(x * 10**(-n)) * 10**n
return result
また、リスト/配列にも適用する必要がある場合は、次のようにベクトル化できます
sig_dig_vec = np.vectorize(sig_dig)
クレジット:この投稿に触発された回答