1. ホーム
  2. python

[解決済み] NumPyの配列を特定の範囲に正規化する方法は?

2022-04-14 14:19:57

質問

音声や画像の配列に対して何らかの処理を行った後、ファイルに書き戻す前に、ある範囲内で正規化する必要があります。 これは、次のように行うことができます。

# Normalize audio channels to between -1.0 and +1.0
audio[:,0] = audio[:,0]/abs(audio[:,0]).max()
audio[:,1] = audio[:,1]/abs(audio[:,1]).max()

# Normalize image to between 0 and 255
image = image/(image.max()/255.0)

もっと冗長でなく、便利な機能の方法はないのでしょうか? matplotlib.colors.Normalize() は関係なさそうですね。

解決方法は?

audio /= np.max(np.abs(audio),axis=0)
image *= (255.0/image.max())

使用方法 /=*= を使えば、中間の一時的な配列が不要になり、メモリを節約することができます。 乗算は除算よりコストがかからないので

image *= 255.0/image.max()    # Uses 1 division and image.size multiplications

よりもわずかに速いです。

image /= image.max()/255.0    # Uses 1+image.size divisions

ここでは基本的なnumpyのメソッドを使用しているので、numpyではこの程度が効率的な解決策だと思います。


インプレース操作では、コンテナ配列の dtype は変更されません。正規化したい値は浮動小数点数なので audioimage 配列は、インプレース操作を実行する前に浮動小数点数の dtype を持つ必要があります。 もし浮動小数点型でないなら,配列の型を変換するために astype . 例えば

image = image.astype('float64')