2017-12-12 11 views
0

形状3x3,5x5,...の異なる配列(dtypenp.float32)をscipy.ndimage.rotateを使用して回転します。入力配列は常にsum <= 1.0です。ほとんどの場合、合計は1.0から非常に小さいイプシロンを引いたものに等しくなります。これらの配列の最小値は常に>= 0.0です。配列の値を特定の値/間隔に変更しますか?

私はいつも値がscipy.ndimage.rotateの結果として[0.0, 1.0]の間隔にある配列を取得する必要がありましたが、ときどき-1.0755285551056204e-16のように最小値が非常に小さいことがあります。私はこれが浮動小数点数の不正確さのために現れると思いますか?

しかし、期待された間隔[0.0, 1.0]に出力配列の値をスカッシュしたいとします(ただし、合計は< = 1.0です)。できるだけ速く(計算時間)これを達成するにはどうすればよいですか?

softmaxのようなものは、配列の値を指数関数的に再スケールして、すでに高い値がさらに高くなっているので、お勧めできません。

返される配列scipy.ndimage.rotateのsum> 1.0(正の浮動小数点の不正確?!)もありましたので、単にsigmoid functionを使用すると良いとは思いません。合計が< = 1.0であることをチェックする。

+0

小さな負の値は本質的に0です。あなたのマトリックスに 'max(0、value)'を付けても問題ありませんか?合計は1から小さなイプシロンを差し引いたものになります。 – pault

+0

配列の最小値(最小値が<0)の場合はabsを加算し、すべての値を合計で除算すると、すべての値> = 0と合計= 1が得られるはずです。しかし、この目標を達成するための他の方法もあります。あなたの目標は、あなたの目標が何であるかに正確に依存します。 – tom10

+0

@ tom10これは合理的で速い方法のように聞こえる。また、値が互いの関係を失わないことを保証するでしょうか? – daniel451

答えて

1

回転にはスプライン補間が必要です。 0と1の間の値の補間は時々[0,1]の区間外の値を生成します。これらの偏差が小さい(そして小さくすべきである)限り、それらについて熟考する必要はありません。 numpy.clipはすばやく仕事をします。

和については、配列の合計はローテーション後に同じであるとは限りません。 reshape=Falseを使用すると、画像の一部が消えます。そうでない場合、新しい画像は、別のグリッドに再補間されたため、古い画像とまったく同じ値を保持しません。合計は上下することができます。

合計が< = 1であることは幾何学的に自然ではないため、幾何学的に自然な方法ではありません。だから、あなたは何でも代数的操作をすることができます。このように:

if image.sum() > 1: 
    image /= image.sum() 
関連する問題