概要
配列をprintで表示させようとして、書式設定でよく間違える。たとえば以下のように。
|
import numpy as np a = np.array([0.0123, 1.2345, 12.3456789]) print("{:.3f}".format(a)) # TypeError: unsupported format string passed to numpy.ndarray.__format__ |
配列の各要素の書式を指定して表示させたい場合、format
メソッドではなく、Numpyのset_printoptions
を使う必要がある。
get_printoptions()
配列の書式オプションの一覧は、numpy.get_printoptions()
で得られる。各オプションは辞書形式で保存されている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
import numpy as np options = np.get_printoptions() for k, v in zip(options.keys(), options.values()): print("{:<9}: {}".format(k, v)) # edgeitems: 3 # threshold: 1000 # floatmode: maxprec # precision: 8 # suppress : False # linewidth: 75 # nanstr : nan # infstr : inf # sign : - # formatter: None # legacy : False |
set_printoptions()
これらのオプションを個別に設定するにはnumpy.set_printoptions()
メソッドでキーと値を指定する。
numpy.set_printoptions([キー]=[値])
よく使いそうないくつかのオプションについてまとめる。
省略表示
threshold
とedgeitems
要素数(列数・行数)がthreshold
に指定した値を越えた場合に省略表示する。
|
np.set_printoptions(threshold=20) print(np.arange(20)) # [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19] print(np.arange(21)) # [ 0 1 2 ... 18 19 20] |
edgeitems
は省略時に表示する要素数(列数・行数)を指定する。
|
np.set_printoptions(edgeitems=5) print(np.arange(40)) # [ 0 1 2 3 4 ... 35 36 37 38 39] |
threshold=0
を指定すると、edgeitemsの値を超えると常に省略表示する(デフォルトの場合、edgeitems=3
を越えると省略表示)。
|
np.set_printoptions(threshold=0, edgeitems=3) print(np.arange(6)) # [0 1 2 3 4 5] print(np.arange(7)) # [0 1 2 ... 4 5 6] |
2次元配列の行も同じ条件で省略表示される。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
print(np.arange(36).reshape(6, 6)) # [[ 0 1 2 3 4 5] # [ 6 7 8 9 10 11] # [12 13 14 15 16 17] # [18 19 20 21 22 23] # [24 25 26 27 28 29] # [30 31 32 33 34 35]] print(np.arange(49).reshape(7, 7)) # [[ 0 1 2 ... 4 5 6] # [ 7 8 9 ... 11 12 13] # [14 15 16 ... 18 19 20] # ... # [28 29 30 ... 32 33 34] # [35 36 37 ... 39 40 41] # [42 43 44 ... 46 47 48]] |
数値の書式
supress
デフォルトでは要素にオーダーが小さい数値が含まれていると浮動小数点表示となり、1つの要素でも浮動小数点表示になるとすべての要素が浮動小数点表示になる。
オプションで'supress=True'
を指定すると、強制的に固定小数点で表示される。
|
import numpy as np a = np.array([0.0000123, 0.123, 12.3]) print(a) # [1.23e-05 1.23e-01 1.23e+01] np.set_printoptions(suppress=True) print(a) # [ 0.0000123 0.123 12.3 ] |
precision
precision
で精度の桁数を指定する。固定小数点数の場合は小数点以下の桁数、浮動小数点数の場合は仮数部の桁数。
|
import numpy as np a = np.array([x / 7 for x in [0.1, 1, 10, 100]]) print(a) # [ 0.01428571 0.14285714 1.42857143 14.28571429] np.set_printoptions(precision=3) print(a) # [ 0.014 0.143 1.429 14.286] b = np.array([x / 7 for x in [0.01, 1, 10, 100]]) print(b) # [1.429e-03 1.429e-01 1.429e+00 1.429e+01] |
floatmode
floatmode
でキーワードを指定し、あらかじめ定められた書式を設定する。
次のような配列でキーワードごとの挙動を確認する。配列a
は最大でもprecision
設定より低い精度、配列b
はprecision
を超える精度の要素を持ち、デフォルトのprecision=8
で表示が丸められている。
|
a = np.array([0.1, 0.123, 0.123456]) b = np.array([0.1, 0.12345, 0.123456789]) print("default :{}".format(a)) print(" :{}".format(b)) # default :[0.1 0.123 0.123456] # :[0.1 0.12345 0.12345679] |
maxprec
デフォルトの設定。各要素がそれぞれ最大の精度で表示される。いずれの配列も、最大精度となる最後尾の要素の桁幅に統一されていて、0埋めはされない。デフォルトはこの設定なので、結果は上と同じ。
|
np.set_printoptions(floatmode='maxprec') print("maxprec :{}".format(a)) print(" :{}".format(b)) # maxprec :[0.1 0.123 0.123456] # :[0.1 0.12345 0.12345679] |
maxprec_equal
maxplec
は0埋めされなかったが、maxprec_equal
は最大精度の桁数に統一された上で0で埋められる(equal
の意味が曖昧、maxprec_zero
とでもしてくれればよかったのに)。
|
np.set_printoptions(floatmode='maxprec') print("maxprec :{}".format(a)) print(" :{}".format(b)) # maxprec_equal:[0.100000 0.123000 0.123456] # :[0.10000000 0.12345000 0.12345679] |
fixed
全ての要素の精度がprecision
に統一され、それより低い精度の場合は0で埋められる。下の例では、2つの配列のすべての要素が小数点以下8桁に統一され、0で埋められている。
|
np.set_printoptions(floatmode='fixed') print("fixed :{}".format(a)) print(" :{}".format(b)) # fixed :[0.10000000 0.12300000 0.12345600] # :[0.10000000 0.12345000 0.12345679] |
unique
precision
は無視され、各要素で必要な分だけの精度が保たれ、桁数は最大精度に統一される。配列b
の最後の要素が丸められていないことに注意。
|
np.set_printoptions(floatmode='unique') print("unique :{}".format(a)) print(" :{}".format(b)) # unique :[0.1 0.123 0.123456] # :[0.1 0.12345 0.123456789] |
formatter
書式設定文字列とformatを渡して、任意の書式を設定する。渡し方は以下の通り。
formatter={'型名' : "{:書式}".format }
型名としては'int'
、'float'
のほか'numpystr'
で文字列も指定できる。
|
import numpy as np a = np.array([0.0123, 1.2345, 12.3456789]) np.set_printoptions(formatter={'float' : "{:10.5f}".format}) print(a) np.set_printoptions(formatter={'float' : "{:15.7e}".format}) print(a) # [ 0.01230 1.23450 12.34568] # [ 1.2300000e-02 1.2345000e+00 1.2345679e+01] |