2017-02-20 11 views
1

私は形状が[12、8、5、5]のnumpy配列を持っています。各要素の3次元と4次元の値を変更したい。numpy配列の3次元要素と4次元要素を更新します

import numpy as np 
x = np.zeros((12, 80, 5, 5)) 

print(x[0,0,:,:]) 

出力:

[[ 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0.]] 

修正値:

y = np.ones((5,5)) 
x[0,0,:,:] = y 
print(x[0,0,:,:]) 

出力:

[[ 1. 1. 1. 1. 1.] 
[ 1. 1. 1. 1. 1.] 
[ 1. 1. 1. 1. 1.] 
[ 1. 1. 1. 1. 1.] 
[ 1. 1. 1. 1. 1.]] 

私は2つのforループを使用して、すべてのx[i,j,:,:]のために変更することができます。しかし、私は2つのループを実行せずにそれを行うためのpythonic方法があるかどうか疑問に思っていました。興味があるだけは知っている:)

UPDATE

実際の使用事例:

dict_weights = copy.deepcopy(combined_weights) 
for i in range(0, len(combined_weights[each_layer][:, 0, 0, 0])): 
    for j in range(0, len(combined_weights[each_layer][0, :, 0, 0])): 
      # Extract 5x5 
      trans_weight = combined_weights[each_layer][i,j] 
      trans_weight = np.fliplr(np.flipud(trans_weight)) 
      # Update 
      dict_weights[each_layer][i, j] = trans_weight 

注:私は、combined_weightsのjは異なります寸法を。このリストには約200の要素があり、iとjの次元はさまざまですが、3次元と4次元は常に同じです(つまり5x5)。

2つのforループを実行せずに、combine_weights [、、:、5、5]要素を転置値で更新できるかどうかを知りたいだけです。

ありがとうございました。

+0

は何でそれらを更新したいですか?おそらく単なるものではないでしょうか?ここに違いがあるので、詳細を教えてください。 –

+0

3番目と4番目の要素[i、j、:、:]を転置して配列を更新する必要があります。 – blackbug

+0

'transpose'や' swapaxes'を使わないのはなぜですか?彼らは1つの行でそれを行います - そして時間は全くありません。 (これらの関数は実際のデータを移動することなく、データレイアウトを変更するので、超安価です) –

答えて

2

単純に行う -

dict_weights[each_layer] = combined_weights[each_layer][...,::-1,::-1] 
+0

私はここでnoiceの質問をしています:[...、:: - 1、 - - 1]を解釈する方法。 '...'は通常完全な範囲です – blackbug

+1

@blackbugさて、私は['this post'](http://stackoverflow.com/a/773472/3293881)にあなたを紹介します。 ''省略形(...)はここでは指定されていない残りの配列次元のプレースホルダを示すために使用されています。 "したがって、我々は最初の2つの軸を示すために省略記号を使用しています。最後の2つの軸をそれぞれの4D配列に ':: - 1'で指定しています。 – Divakar

関連する問題