2017-09-28 8 views
1

numpyの配列dataの形[128,64,64,64]を持っています。そして、128個のスライスのそれぞれを範囲[0.0,1.0 ]。私は、np.max(data [0、...])、np.max(data [1、...])... np.max(data [127、...])を使って計算できることを理解しています各スライスの最大値は、私はこれをより効率的に行うことができますかと思います。numpyの配列でサブアレイを正規化する方法

このような

基本的なもの:

data_min = np.min(data[:,...]) 
data_max = np.max(data[:,...]) 
norm_data = (data[:,...] - data_min)/(data_max - data_min) 

結果はまだ持っている必要があります形状[128、64、64、64] しかし、私は特定の最小/最大機能とオプションの目的で使用するためにどの考え出したていません結果を得る。

お知らせください。 ありがとう!

+0

元の形状は '[128,64,64,64]'でしたか? –

+0

ちょうどそれを訂正しました – galactica

答えて

1

後、私たちはそうのように、正規化の式を使用して、入力データを正規化するために、それらを使用する際にbroadcastingで私たちを助けるために寸法を維持しながら、最小値と最大値を取得します -

mins = data.min(axis=(1,2,3), keepdims=True) 
maxs = data.max(axis=(1,2,3), keepdims=True) 
norm_data = (data-mins)/(maxs-mins) 
+0

これは、最初の次元に沿ってサブアレイごとに正規化したいと思っていましたが、data [0、...]、data [1、...]などのようにndarray全体を正規化しているようです。それに応じて変更する方法? – galactica

+0

@galactica編集内容を確認してください。 – Divakar

+0

クール〜!それは今働く。 'keepdims'はこのような状況では重要だと思われます。ありがとう! – galactica

0

あなたが適用するnp.vectorizeを使用することができます配列の全要素にわたる関数:

def norm(element): 
    return (element - data_min)/(data_max - data_min) 

ndnorm = np.vectorize(norm) 

data_min = data.min() 
data_max = data.max() 

norm_data = ndnorm(data) 
+0

これを書き直して、最初のディメンションに沿ってサブアレイを正規化しても構いませんか? vectorize()がどのように動作するのか興味があります – galactica

+1

'np.vectorize'に関する情報は、[numpyリファレンス](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy)で簡単に見つけることができます。 vectorize.html)。最初の次元に沿って各部分配列を正規化するには、forループの各部分配列に同じ関数を適用できます。 'norm_data = np.array([ndnorm(subarr、subarr.min()、subarr.max())]の引数に' data_min'と 'data_max'を1行で追加します。データ]) ' –

関連する問題