web-dev-qa-db-ja.com

複素数のフォーマット

私のクラスのプロジェクトでは、小数点以下5桁までの数値を出力する必要があります。出力が複素数になる可能性があり、小数点以下5桁の複素数を出力する方法がわかりません。フロートの場合、私はそれがちょうどであることを知っています:

print "%0.5f"%variable_name

複素数に似たものはありますか?

19
island_hopper

このような質問の場合は、 Pythonドキュメント を最初に停止する必要があります。具体的には、 文字列フォーマット のセクションをご覧ください。すべての文字列フォーマットコードが一覧表示されます。複素数用のものはありません。

x.realx.imagを使用して、数値の実数部と虚数部を別々にフォーマットし、a + bi形式で印刷することができます。

4
David Z

以下に示すように、str.format()メソッドを使用してこれを行うことができます。

_>>> n = 3.4+2.3j
>>> n
(3.4+2.3j)
>>> '({0.real:.2f} + {0.imag:.2f}i)'.format(n)
'(3.40 + 2.30i)'
>>> '({c.real:.2f} + {c.imag:.2f}i)'.format(c=n)
'(3.40 + 2.30i)'
_

正と負の両方の虚数部を適切に処理するには、(さらに)複雑なフォーマット操作が必要になります。

_>>> n = 3.4-2.3j
>>> n
(3.4-2.3j)
>>> '({0:.2f} {1} {2:.2f}i)'.format(n.real, '+-'[n.imag < 0], abs(n.imag))
'(3.40 - 2.30i)'
_

更新-より簡単な方法

文字列フォーマット演算子_%_を使用して、複素数の表示タイプとしてfを使用することはできませんが:

_n1 = 3.4+2.3j
n2 = 3.4-2.3j

try:
    print('test: %.2f' % n1)
except Exception as exc:
    print('{}: {}'.format(type(exc).__name__, exc))
_

出力:

_TypeError: float argument required, not complex
_

ただし、canは、str.format()メソッドを介して複素数で使用できます。これは明示的に文書化されていませんが、 フォーマット仕様ミニ言語 文書によって暗示されています。

_'f'_固定小数点。数値を固定小数点数として表示します。デフォルトの精度は_6_です。

。 。 。だから見落としがちです。具体的には、以下はPython 2.7.14と3.4.6の両方で機能します。

_print('n1: {:.2f}'.format(n1))
print('n2: {:.2f}'.format(n2))
_

出力:

_n1: 3.10+4.20j
n2: 3.10-4.20j
_

これは、私の元の回答のコードを完全に制御することはできませんが、確かにはるかに簡潔です(そして、正と負の両方の虚数部を自動的に処理します)。

更新2-f-strings

フォーマットされた文字列リテラル (別名f-strings)ここでPython 3.6、つまり、そのバージョン以降でこのように行われます。

_print(f'n1: {n1:.2f}')  # -> n1: 3.40+2.30j
print(f'n2: {n2:.3f}')  # -> n2: 3.400-2.300j
_
25
martineau

文字列フォーマット操作 -つまりモジュロ(_%_)演算子)-も新しいstr.format()文字列構文のフォーマット も複合型をサポートしていません。ただし、すべての組み込み数値型の___format___メソッドを直接呼び出すことは可能です。次に例を示します。

_>>> i = -3 # int
>>> l = -33L # long (only Python 2.X)
>>> f = -10./3 # float
>>> c = - 1./9 - 2.j/9 # complex
>>> [ x.__format__('.3f') for x in (i, l, f, c)]
['-3.000', '-33.000', '-3.333', '-0.111-0.222j']
_

これは負の虚数部でもうまく機能することに注意してください。

3
martink
>>> n = 3.4 + 2.3j
>>> print '%05f %05fi' % (n.real, n.imag)
3.400000 2.300000i
3
Facundo Casco

Python 2.6以降、独自のクラスのオブジェクトがフォーマット文字列にどのように応答するかを定義できます。したがって、フォーマット可能なcomplexのサブクラスを定義できます。例を次に示します。

>>> class Complex_formatted(complex):
...     def __format__(self, fmt):
...         cfmt = "({:" + fmt + "}{:+" + fmt + "}j)"
...         return cfmt.format(self.real, self.imag)
... 
>>> z1 = Complex_formatted(.123456789 + 123.456789j)
>>> z2 = Complex_formatted(.123456789 - 123.456789j)
>>> "My complex numbers are {:0.5f} and {:0.5f}.".format(z1, z2)
'My complex numbers are (0.12346+123.45679j) and (0.12346-123.45679j).'
>>> "My complex numbers are {:0.6f} and {:0.6f}.".format(z1, z2)
'My complex numbers are (0.123457+123.456789j) and (0.123457-123.456789j).'

このクラスのオブジェクトは、より多くのスペースを取り、動作が遅くなることを除いて、complex数値とまったく同じように動作します。読者は注意してください。

1
FutureNerd