2017-02-20 63 views
1

我有一个numpy数组形状[12,8,5,5]。我想修改每个元素的第三维和第四维的值。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.]] 

我可以修改使用两个for循环中的所有x[i,j,:,:]。但是,我想知道是否有没有运行两个循环的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维度,但是第三和第四维度总是相同的(即5x5)。

我只是想知道,如果我可以更新元素combined_weights [:,:,5,5]转置的值而不运行2 for循环。

谢谢。

+0

你想在更新他们什么?可能不只是一个?请给出更多细节,因为它在这里有所不同。 –

+0

我需要转置第三和第四 - D [i,j,:,:]的元素,然后更新数组。 – blackbug

+0

为什么不使用'transpose'或'swapaxes'?他们会在一行中做 - 而且没有时间。 (这些功能只是改变数据布局,而不移动实际数据,所以它们超级便宜) –

回答

2

根本 -

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

我有一个noice问题在这里:如何解释[...,:: - 1,:: - 1]。 '...'通常是完整的范围 – blackbug

+1

@blackbug嗯,我会引用你['这篇文章'](http://stackoverflow.com/a/773472/3293881)。从这里可以得到与此相关的信息:''省略号(...)用于指示未指定的其余数组维度的占位符。“因此,我们使用这个省略号来表示前两个轴,因为我们在该4D阵列中用':: - 1'指定了最后两个轴。 – Divakar