3

ndarray で浮動小数点数を見つけようとしました。私が使用しているソフトウェア パッケージ (Abaqus) が原因で、出力される精度が少し低くなります。たとえば、10 は 10.00003 のようなものです。したがって、それを行うための「正しい」方法があるかどうか疑問に思っていました。それは私のコードよりもきれいです。

コード例:

import numpy as np

array = np.arange(10)
number = 5.00001

私がこれを行う場合:</p>

idx = np.where(number==array)[0][0]

5.00001 は 5 に等しくないため、結果は空になります。

今私はやっています:

atol = 1e-3 # Absolute tolerance
idx = np.where(abs(number-array) < atol)[0][0]

これは機能し、あまり面倒ではありません...それでも、もっときちんとした方法があるのではないかと思っていました。ありがとう!

PS:numpy.allclose()それを行う別の方法ですが、使用する必要がありnumber * np.ones([array.shape[0], array.shape[1]])、まだ冗長に思えます...


編集:素晴らしい回答をありがとうございました!np.isclose() は私が探している正確な関数であり、ドキュメントにないため見逃していました...ドキュメントが更新されるまで、あなたがいなければ気づかなかったでしょう。ありがとうございました!

4

3 に答える 3

2

最新の numpy (1.7) を使用している場合、最適な方法はnp.isclose、形状を自動的に一緒にブロードキャストする which を使用することです。

import numpy as np
a = np.arange(10)
n = 5.000001
np.isclose(a, n).nonzero()
#(array([5]),)

または、一致が 1 つしかないと予想される場合は、次のようになります。

np.isclose(a, n).nonzero()[0][0]
#5

( if 条件 then/else 機能がないことnp.nonzeroを除いて、基本的には と同じです)np.where

于 2013-09-09T21:18:24.633 に答える
0

上記で使用した方法、具体的abs(A - B) < atolには は、多くの言語で浮動小数点比較を行うための標準です。明らかにnumpyを使用する場合、Aおよび/またはB配列または数値にすることができます。

これは、見るのに役立つかもしれない別のアプローチです。あなたのケースに当てはまるかどうかはわかりませんが、配列内で複数の数値を探している場合 (これは一般的な使用例です)、非常に役立ちます。これは、似たようなこの質問に触発されています。

import numpy as np

def find_close(a, b, rtol=1e-05, atol=1e-08):
    tol = atol + abs(b) * rtol
    lo = b - tol
    hi = b + tol
    order = a.argsort()
    a_sorted = a[order]
    left = a_sorted.searchsorted(lo)
    right = a_sorted.searchsorted(hi, 'right')
    return [order[L:R] for L, R in zip(left, right)]

a = np.array([2., 3., 3., 4., 0., 1.])
b = np.array([1.01, 3.01, 100.01])
print find_close(a, b, atol=.1)
# [array([5]), array([1, 2]), array([], dtype=int64)]
于 2013-09-09T22:18:26.293 に答える