web-dev-qa-db-ja.com

str(numpy.float64)の精度を設定するにはどうすればよいですか?

追加の文字列コンテンツを含むcsvファイルにいくつかのnumpyfloatを書き込む必要があります。したがって、numpy.set_printoptions()でsavetxtなどを使用しないでください。印刷動作のみを定義できますが、str()動作は定義できません。私は何かが恋しいことを知っています、そしてそれはそれほど難しいことではありません、しかし私はインターウェブ上で合理的な答えを見つけられません。多分誰かが私を正しい方向に向けることができます。ここにいくつかのサンプルコードがあります:

In [1]: import numpy as np
In [2]: foo = np.array([1.22334])

In [3]: foo
Out[3]: array([ 1.22334])

In [4]: foo[0]
Out[4]: 1.2233400000000001

In [5]: str(foo[0])
Out[5]: '1.22334'

In [6]: np.set_printoptions(precision=3)

In [7]: foo
Out[7]: array([ 1.223])

In [8]: foo[0]
Out[8]: 1.2233400000000001

In [9]: str(foo[0])
Out[9]: '1.22334'

Np.floatを、file.write()にフィードできる適切にフォーマットされた文字列に変換するにはどうすればよいですか?

敬具、

fookatchu

17
Fookatchu

標準の文字列フォーマットを使用できます。

>>> x = 1.2345678
>>> '%.2f' % x
'1.23'
14
David Heffernan

通常の文字列フォーマットを使用できます。以下を参照してください。 http://docs.python.org/library/string.html#formatspec

例:

print '{:.2f}'.format(0.1234)  # '0.12'
print '{:.2e}'.format(0.1234)  # '1.23e-01'
12
tillsten

Numpy 1.14以降には format_float_positional および format_float_scientific 浮動小数点スカラーを、丸め、トリミング、およびパディングを制御して、位置表記または科学表記の10進文字列としてフォーマットする関数。これらの関数は、従来のPython文字列フォーマッタよりもはるかに多くのフォーマット制御を提供します。

import numpy as np

x = np.float64('1.2345678')
print(np.format_float_positional(x))  # 1.2345678
print(np.format_float_positional(x, precision=3))  # 1.235
print(np.format_float_positional(np.float16(x)))  # 1.234
print(np.format_float_positional(np.float16(x), unique=False, precision=8))  # 1.23437500

y = x / 1e8
print(np.format_float_scientific(y))  # 1.2345678e-08
print(np.format_float_scientific(y, precision=3, exp_digits=1))  # 1.235e-8

等.


これらの高度なフォーマッターは、Dragon4アルゴリズムに基づいています。この件について詳しくは、Ryan Juckettの 浮動小数点数の印刷 を参照してください。

5
Mike T

str(foo[0])の代わりに、"%.3f" % foo[0]を使用してください。

3
Ned Batchelder

また、次のことができます。

precision = 2
str(np.round(foo[0], precision))

Numpyによって「-inf」にきちんと処理されるstr(np.log(0.0))を文字列化する必要がある場合、( '%。2f'%x)よりもいくつかの利点がありました。ここで気になります。

0
fabrica