27

これを検索してみましたが、満足のいく答えが見つかりません。

数値のリスト/配列を取り、それらをすべて n 有効数字に丸めたいと思います。これを行う関数を作成しましたが、標準的な方法があるかどうか疑問に思っていましたか? 探したけど見つからない。例:

In:  [  0.0, -1.2366e22, 1.2544444e-15, 0.001222 ], n=2
Out: [ 0.00, -1.24e22,        1.25e-15,  1.22e-3 ]

ありがとう

4

13 に答える 13

6

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はこの問題の側面を解決するようです。ただし、指数が負の場合は、期待どおりの結果が得られません。

于 2013-09-20T11:16:48.377 に答える
3

あなたが持っている数値の例から、小数点以下ではなく有効数字を意味していると思います(小数点-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
于 2013-09-20T14:02:58.947 に答える
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型に再変換することは可能です...そして、それは明らかに文字列に存在する数字だけを保持します。ただし、位置浮動小数点形式に変換されます...さらに作業が必要になるため、再変換は、多数の数値セットではおそらくかなり悪い考えだと思います。

また、これはイテラブルでは機能しません...詳細についてはドキュメントを参照してください。

于 2020-05-12T13:57:45.477 に答える
0

うまく機能するもう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)

クレジット:この投稿に触発された回答

于 2020-11-06T13:50:38.313 に答える