6

特定の NumPy が意味する制約に対して未知の値をテストしたいdtype- たとえば、整数値を持っている場合、それは a に収まるほど小さいuint8か?

私が確認できる限り、NumPy のdtypeアーキテクチャは次のようなことを行う方法を提供していません。

### FICTIONAL NUMPY CODE: I made this up ###
try:
    numpy.uint8.validate(rupees)
except numpy.dtype.ValidationError:
    print "Users can't hold more than 255 rupees."

私の小さなファンタジー API は Django のモデル フィールド バリデーターに基づいていますが、これは 1 つの例にすぎません。

>>> nd = numpy.array([0,0,0,0,0,0], dtype=numpy.dtype('uint8'))
>>> nd[0]
0
>>> nd[0] = 1
>>> nd[0] = -1
>>> nd
array([255,   0,   0,   0,   0,   0], dtype=uint8)
>>> nd[0] = 257
>>> nd
array([1, 0, 0, 0, 0, 0], dtype=uint8)

numpy.ndarray疑わしい値をtyped as で明示的にラウンドトリップするnumpy.uint8と、適切なサイズにラップされた整数が返されます-例外を投げたり、他の種類の実用的なエラー状態を発生させたりすることはありません.

もちろん、私はむしろ建築宇宙飛行士のフライト スーツを着用したくありませんが、それは代替案として望ましいものif dtype(this) ... elif dtype(that)です。独自の API を作成するという壮大で贅沢な行為に着手する以外に、ここでできることはありますか?

4

3 に答える 3

6

が元の反復可能である場合a、次の行に沿って何かを行うことができます。

np.all(np.array(a, dtype=np.int8) == a)

非常に簡単に言えば、これは結果を元の値と比較し、ndarrayへの変換ndarrayが無損失であったかどうかを示します。

これは、一部の値を正確に表すには狭すぎる浮動小数点型を使用するようなものもキャッチします。

>>> a = [0, 0, 0, 0, 0, 0.123456789]
>>> np.all(np.array(a, dtype=np.float32) == a)
False
>>> np.all(np.array(a, dtype=np.float64) == a)
True

編集:浮動小数点数で上記のコードを使用する場合の1つの注意点は、NaNが常に等しくないことを比較することです。必要に応じて、その場合も処理するようにコードを拡張するのは簡単です。

于 2012-11-06T22:41:02.073 に答える
1

numpy iinfo / finfo構造体を見てください。これらは、基本的な dtype で機能する検証サービスに必要なすべての情報を提供する必要があります。これは、複合フィールドまたはバイナリ フィールドの dtype では機能しません。このためには、サービス スケルトンを実装する必要があります。

于 2013-10-30T15:26:44.643 に答える
0

オーバーフロー時に警告/エラーをトリガーするには、numpy.seterr()withを使用してみてください。over

例えば

numpy.seterr(over='raise')
于 2012-11-06T22:41:09.943 に答える