我在python中有一个三维数组。我想在第一个[z]索引上移动[z] [y] [x]“立方体”。但是,移位的数量将根据[y]和[x]而变化。换句话说,我希望我可以为numpy.roll提供类似numpy.roll(3Darray,2Dvector,axis = 0)的内容,其中2Dvector将指定每个[y] [x]的移位量。对不起,如果这是一个糟糕的描述,我是新来的。
这是使用非感知3-D阵列的示例。第一个2-D切片是全部整数,第二个切片是大写字母,第三个是小写字母。我之所以选择这一点,那么更明显的是什么是“移动”。
old_array([[[6 3 9]
[4 4 8]
[3 1 6]]
[[A C F]
[T Z Q]
[L M P]]
[[b z j]
[q o k]
[u y r]]])
现在我想将第一个切片滚动到第3个切片,如果第一个切片中的值小于5.结果将如下所示:
new_array([[[6 C 9]
[T Z 8]
[L M 6]]
[[A z F]
[q o Q]
[u y P]]
[[b 3 j]
[4 4 k]
[3 1 r]]])
我尝试过类似的事情:
a[a[0]<5] = np.roll(a[a[0]<5],1,axis=0)
但无论我为轴设置选择什么,都没有得到我想要的结果。
答案 0 :(得分:0)
这是一个可能的解决方案,我已将其分解为可管理的步骤:
#roll the whole array
rolled_array = np.roll(old_array,-1,axis=0)
#Create a partial mask based on the first slice
mask_part = np.where(old_array[0,:,:] < 5 , True,False)
#Replicate the partial mask for the other two slices
mask_full = np.array([mask_part,mask_part,mask_part])
#apply the mask to numpy.where
new_array = np.where(mask_full,rolled_array,old_array)
希望这有帮助。