NumPy配列を特定の範囲内に正規化するにはどうすればいいですか? 質問する

NumPy配列を特定の範囲内に正規化するにはどうすればいいですか? 質問する

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

# 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()関係ないようです。

ベストアンサー1

# Normalize audio channels to between -1.0 and +1.0
audio /= np.max(np.abs(audio),axis=0)
# Normalize image to between 0 and 255
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 が必要です。まだ浮動小数点 dtype でない場合は、 を使用して変換する必要がありますastype。たとえば、

image = image.astype('float64')

おすすめ記事