これはhttps://github.com/pytorch/pytorch/issues/33568で取り上げられました
>>> np.clip([3 + 4.j], -1, 2)
array([2.+0.j])
>>> np.clip([3 + 4.j], -1+1.j, 2+12.j) # imaginary component goes up
array([2.+12.j])
>>> np.clip([1 + 4.j], -1+1.j, 2+12.j) # imaginary component doesn't go up
array([1.+4.j])
複雑な入力の唯一のテストは、セグメンテーション違反がないことです。
合理的な行動は次のいずれかです。
これはそれほど重要な問題ではないと思いますが、少なくともここに望ましい動作を文書化しておくとよいでしょう。
現在の動作は、 x = sorted(x)
に対してx = [min, clip(arr, min, max), max]
x = sorted(x)
を作成することだと思います。
最小、最大との一貫性を破り、ここで非自明な動作の選択のためにソートすることが価値があるとは思えません。 それができないわけではありませんが、おそらく最小/最大と並べ替えの動作についても説明する必要があります...
つまり、 absmin
、 absmax
、およびabssort
が理にかなっており、基本的にそれをクリッピングに使用します。
非実数の入力に対してエラーを与えるだけで、より簡単に確信できます。
編集:おそらくコンポーネントごとのクリッピングは、より厳密であるため、実際にはEricsの動作を可能にします。 しかし、ちょっと注意してください、私はそれが有用であるとしてそれを買うかどうかわかりません。 もう1つの質問は、これの実際のユースケースはありますか? 別のコードで明確ではないもの?
実数部と虚数部を別々にクリップします
それが私の最初の選択です。
位相を変えずに絶対値をクリップ
便利かもしれませんが、単純なクリップよりも実装が複雑です。
もう1つの質問は、これに対する実際の_ユースケース_はありますか? 別のコードで明確ではないもの?
それは良い質問です。 よく分かりません。 私が知っているのは、それがそれほど明らかに間違っているべきではないということだけです。
実数部と虚数部を別々に切り抜くのが気になります。 たとえば、並べ替えられた配列がある場合、クリッピングは通常、配列を3つの領域[min_value、unchanged、max_value]に変更します。 ただし、複雑な配列の実数部と虚数部を別々にクリップすると、これらの分離可能な領域はなくなります。 代わりに、最小値未満または最大値を超えて比較しなくても、値が変わる可能性があります。
また、複素数を正確にクリッピングすることで何ができるかについて確信が持てるようになるまで、動作を無効にすることをお勧めします。 私の提案は、c <min_valueの場合はmin_valueに設定され、c> max_valueの場合はmax_valueに設定されるというものです。
@mruberry 、私は同意しました。いずれにせよ、誰かがこれのユースケースさえ持っているかどうかさえのに大いに役立ちます。 少し悪くないようにするための1つの引数として、 min <= max
だけではなく、 min.real <= max.real
とmin.imag <= max.imag
を確認すると、問題はありません(ただし、現在は実際にはそうではありません) NumPyでこれを確認してください)。
私もあなたに同意します@seberg ;)。
今のところ、PyTorchで複雑な入力のクリッピング(クランプと呼びます)を無効にするつもりだと思います。 とにかく、私たちの行動はNumPyの行動と矛盾していました。
この問題を読んでいるだけで、numpyでの辞書式比較を考えると、この動作は実際に理にかなっていると思います。 ただし、辞書式比較を非推奨にする場合は、clip、max、minも従う必要があります。 これがここでのコンセンサスだったと思いますが、コメントやリンクされたPRからはよくわかりませんでした。
最も参考になるコメント
@mruberry 、私は同意しました。いずれにせよ、誰かがこれのユースケースさえ持っているかどうかさえのに大いに役立ちます。 少し悪くないようにするための1つの引数として、
min <= max
だけではなく、min.real <= max.real
とmin.imag <= max.imag
を確認すると、問題はありません(ただし、現在は実際にはそうではありません) NumPyでこれを確認してください)。