2017-12-04 6 views
0

(Windows 7、Python 3.4.5 | Anaconda 2.2.0(64ビット)|(デフォルト、Jul 5 2016、14:53:07)[MSC v.1600 64ビット(AMD64)])numpy set_printoptions精度がタプルのリストで無視される

私はきちんとnp.set_printoptions(精度を使用して、いくつかのデータを印刷しようとしていた=と、なぜ無視しているようだ

import numpy as np 
np.set_printoptions(precision=4) 

a=[[1,15.02], 
[2,14.38], 
[3,14.60]] 

b=np.array(a) 
print(b) 
at=b.T 
l=list(zip(at[0],at[1])) 
print(l) 

出力:?

[[ 1. 15.02] 
[ 2. 14.38] 
[ 3. 14.6 ]] 
[(1.0, 15.02), (2.0, 14.380000000000001), (3.0, 14.6)] 
+0

これはもうnp-arrayではないので、numpyの印刷機械は使用されていないのですか? – sascha

+0

この場合、どの印刷技術が適用されるべきですか? – Krischu

+0

正確なユースケースに応じて、[this](https://stackoverflow.com/a/1567630/2320035)のような文字列フォーマットに基づいて自分自身を定義する必要があります。 – sascha

答えて

0

フロートの問題:

In [118]:ref=decimal.Decimal('14.380000000000000000000000000000000000000000000000') 

In [119]: decimal.Decimal(14.38) 
Out[119]: Decimal('14.3800000000000007815970093361102044582366943359375') 

In [120]: decimal.Decimal(14.38)-ref 
Out[120]: Decimal('7.815970093361102044582366943E-16') 

In [121]: decimal.Decimal(14.38-2**-50)-ref 
Out[121]: Decimal('-9.947598300641402602195739746E-16') 

これは、14.380000000000001が14.38の最適なfloat64近似値であることを示しています。

はこの事実を回避するために、あなたはnp.float32にダウングレードすることができます。しかし

In [140]:tuple(zip(*np.array(a).T.astype(np.float32))) 
Out[140]: ((1.0, 15.02), (2.0, 14.38), (3.0, 14.6)) 
0
In [34]: a 
Out[34]: [[1, 15.02], [2, 14.38], [3, 14.6]] 
In [35]: b=np.array(a, dtype=float).T 
In [36]: b 
Out[36]: 
array([[ 1. , 2. , 3. ], 
     [ 15.02, 14.38, 14.6 ]]) 
In [37]: list(zip(*b)) 
Out[37]: [(1.0, 15.02), (2.0, 14.380000000000001), (3.0, 14.6)] 

もし私最初の過去btolist通過:最初のケースで

In [38]: list(zip(*b.tolist())) 
Out[38]: [(1.0, 15.02), (2.0, 14.38), (3.0, 14.6)] 

の要素タプルはまだnp.float64のラッパーを持っていますが、tolistはすべてそれらをネイティブのPython番号に抽出します:

In [39]: type(list(zip(*b))[1][1]) 
Out[39]: numpy.float64 
In [40]: type(list(zip(*b.tolist()))[1][1]) 
Out[40]: float 

itemは、ネイティブの数を抽出する別の方法です:

In [41]: list(zip(*b))[1][1] 
Out[41]: 14.380000000000001 
In [42]: list(zip(*b))[1][1].item() 
Out[42]: 14.38 

私はsetprintoptionsnp.float64の場合には適用されない理由を言うことはできませんが、np.arrayを行います。

一般に、配列とそのすべての値をネイティブのPythonリストに変換する場合は、tolist()を使用する方がよいでしょう。リストやジップのような操作では不十分です。彼らは、配列の最初の次元に繰り返すが、再帰的要素変換しません。

部分変換(S):

In [43]: list(b) 
Out[43]: [array([ 1., 2., 3.]), array([ 15.02, 14.38, 14.6 ])] 
In [44]: list(b[1]) 
Out[44]: [15.02, 14.380000000000001, 14.6] 

全変換:どうやら

In [45]: b.tolist() 
Out[45]: [[1.0, 2.0, 3.0], [15.02, 14.38, 14.6]] 

float64のフォーマッタは、set_printoptionsの値に関係なく、すべての精度を示します。

In [58]: 14.380000000000001 
Out[58]: 14.38 
In [59]: np.array(14.380000000000001) 
Out[59]: array(14.38) 
In [60]: np.float64(14.380000000000001) 
Out[60]: 14.380000000000001 
In [61]: np.float32(14.380000000000001) 
Out[61]: 14.38 

np.float64(...)オブジェクトは多くの点で単一のアイテム配列のようですが、微妙な点で異なります。通常、このようなオブジェクトは直接作成しませんが。

関連する問題