45

numpy には次のような配列があります

[0 +  0.5j, 0.25 + 1.2352444e-24j, 0.25+ 0j, 2.46519033e-32 + 0j] 

超低い値をゼロに設定して取得する最も速くて簡単な方法は何ですか?

[0 +  0.5j, 0.25 + 0j, 0.25+ 0j, 0 + 0j] 

効率は最優先事項ではありません。

4

6 に答える 6

37

うーん。私はそれにとても満足していませんが、これはうまくいくようです:

>>> a = np.array([0 +  0.5j, 0.25 + 1.2352444e-24j, 0.25+ 0j, 2.46519033e-32 + 0j])
>>> a
array([  0.00000000e+00 +5.00000000e-01j,
         2.50000000e-01 +1.23524440e-24j,
         2.50000000e-01 +0.00000000e+00j,   2.46519033e-32 +0.00000000e+00j])
>>> tol = 1e-16
>>> a.real[abs(a.real) < tol] = 0.0
>>> a.imag[abs(a.imag) < tol] = 0.0
>>> a
array([ 0.00+0.5j,  0.25+0.j ,  0.25+0.j ,  0.00+0.j ])

また、問題の必要に応じて許容範囲を選択できます。私は通常、よりも一桁かそれ以上高いものを使用します

>>> np.finfo(np.float).eps
2.2204460492503131e-16

しかし、それは問題に依存しています。

于 2013-01-19T22:00:04.147 に答える
29

epsゼロ未満の要素を設定するには:

a[np.abs(a) < eps] = 0

より効率的な特殊な機能があるかもしれません。

代わりに小さなフロートの印刷を抑制したい場合:

import numpy as np
a = np.array([1+1e-10j])
print a # -> [ 1. +1.00000000e-10j]

np.set_printoptions(suppress=True)
print a # -> [ 1.+0.j]
于 2013-01-19T22:13:34.503 に答える
-2
diff = x-y
diff[diff>1.e-16]

Out[93]:
array([], dtype=float64)

diff[diff>1.e-18]

array([1.73472348e-18, 1.73472348e-18, 1.73472348e-18, 1.73472348e-18,
       1.73472348e-18, 1.73472348e-18, 1.73472348e-18, 1.73472348e-18,
       1.73472348e-18, 1.73472348e-18, 1.73472348e-18, 1.73472348e-18,
       1.73472348e-18, 1.73472348e-18, 1.73472348e-18, 1.73472348e-18,
       1.73472348e-18])
于 2019-01-20T17:37:32.853 に答える