python shift 3-d数组

时间:2016-02-09 22:39:49

标签: python arrays numpy

我在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)

但无论我为轴设置选择什么,都没有得到我想要的结果。

1 个答案:

答案 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)

希望这有帮助。