2014-01-08 25 views
30

に浮かぶ:フォーマットはnumpyの配列

[2.15295647e+01, 8.12531501e+00, 3.97113829e+00, 1.00777250e+01] 

どのように私は、小数点を移動し、私はこのようなnumpyの配列で終わるように、数値をフォーマットすることができます

[21.53, 8.13, 3.97, 10.08] 

np.around(a, decimals=2)私には[2.15300000e+01, 8.13000000e+00, 3.97000000e+00, 1.00800000e+01]しか与えられません。それは私が望んでいないもので、私はそれを行う別の方法を見つけていません。

+0

[科学的表記法と所定の精度を持たずにnumpy.arrayをきれいに印刷する方法は?](http://stackoverflow.com/questions/2891790/how-to-pretty-printing-a-numpy- array-without-scientific-notation-with-given) –

答えて

43

を任意のフォーマットでnumpyの表示フロートアレイを作るために、あなたはその入力としてfloat値を受け取り、フォーマットされた文字列を返すカスタム関数を定義することができます。

In [1]: float_formatter = lambda x: "%.2f" % x 

ここではfは固定小数点形式(科学的ではない)を意味し、.2は2桁の小数点以下を意味します(文字列のフォーマットについてはhereを参照してください)。

のはfloat値でそれをテストしてみましょう:

In [2]: float_formatter(1.234567E3) 
Out[2]: '1234.57' 

すべてのフロートアレイをこのようにnumpyの印刷を行うには、あなたがnp.set_printoptionsformatter=引数を渡すことができます。

In [3]: np.set_printoptions(formatter={'float_kind':float_formatter}) 

今numpyの意志を印刷すべてのフロート配列は次のようになります。

In [4]: np.random.randn(5) * 10 
Out[4]: array([5.25, 3.91, 0.04, -1.53, 6.68] 

この時にのみnumpyの配列ではなく、スカラー影響:

In [5]: np.pi 
Out[5]: 3.141592653589793 

をまた非山車、複雑な山車などには影響しません - あなたは、他のスカラー型のために別々のフォーマッタを定義する必要があります。

は、numpyが浮動小数点値を表示する方法に影響します。計算で使用される実際の値は元の精度を保持します。例えば

In [6]: a = np.array([1E-9]) 

In [7]: a 
Out[7]: array([0.00]) 

In [8]: a == 0 
Out[8]: array([False], dtype=bool) 

numpyのプリントa0に等しかったが、それはないかのように - それはまだ1E-9に等しいです。

実際に配列内の値を計算で使用する方法に影響を与えるように丸めたい場合は、np.roundを使用する必要があります。

0
[ round(x,2) for x in [2.15295647e+01, 8.12531501e+00, 3.97113829e+00, 1.00777250e+01]] 
13

ラウンド機能を使用できます。ここではいくつかの例

numpy.round([2.15295647e+01, 8.12531501e+00, 3.97113829e+00, 1.00777250e+01],2) 
array([ 21.53, 8.13, 3.97, 10.08]) 

あなただけの表現を表示変更したい場合、私はそれが上記の提案として、世界的に印刷形式を変更することはお勧めしませんでしょう。私は定位置に出力をフォーマットします。

>>a=np.array([2.15295647e+01, 8.12531501e+00, 3.97113829e+00, 1.00777250e+01]) 
>>> print [ "{:0.2f}".format(x) for x in a ] 
['21.53', '8.13', '3.97', '10.08'] 
+0

これは、ほとんどのユーザが意図しているように、表示値だけでなく、表現を変更することに留意されたい。 –

+0

@RamonMartinezあなたは正しいです。以前に提案されたように、印刷フォーマットをグローバルに変更する考えが嫌だったので、これを投稿しました。後でプログラムの別の部分で、あなたは0.00を取得し、なぜstackoverflowで新しいトピックを作成することがありますこれが起こります。だから、この場合、aはnumpyの配列や他の反復可能なオブジェクト(list、tuple ....)で、aのxには単に "" {:0.2f} "format(x)"を使います。この場合、他の印刷形式は変更しないでください。 – rth

23

実際の精度と表示精度が混乱しています。小数点以下四捨五入は、バイナリで正確に表すことはできません。あなたは試してみてください:

> np.set_printoptions(precision=2) 
> np.array([5.333333]) 
array([ 5.33]) 
+0

これは私の問題を部分的に解決しました。私はまだ21.5の代わりに2.15e + 01のようなe + 01を取得します。 – Kaly

+3

@kaly Hm、独自のフォーマッタ( 'np.set_printoptions(formatter = {float:float_formatting_function})')を書いてみてください。 – U2EF1

関連する問題