移动3D numpy阵列

时间:2013-04-09 07:53:55

标签: python arrays numpy 3d shift

我希望能够沿着高度轴在任一方向上移动3D numpy阵列。 如果给出了3的正移位,则阵列中的所有值都向上移动,并且在阵列的底部出现3个新的零切片。如果给出负移位,则所有切片都会沿着高度轴向下移动,并且新的切片出现在顶部。

我尝试将数组重新整形为1D并左右移动,然后返回3D。但是,这会使阵列沿错误的方向移动。我尝试在重新整形之前实现numpy.rollaxis,从而沿正确的轴移动。但我正在研究的系统无法识别所有numpy函数,也不会执行rollaxis。

谢谢!

1 个答案:

答案 0 :(得分:4)

你的问题有点不明确。首先,“高度”轴不是一个非常明确的定义,你在3D阵列中追求的是哪一个。通过形状元组中的位置定位它们要好得多。我将把它作为“沿着第一轴”的意思,但应该明白如何为另一个轴做这个。

第二,虽然很明显你想要零填充移位的数据,但你没有指定你想对另一边的数据做什么:它是否会消失在数组边界之外并丢失?或者是否应该扩展数组以保持一切?

对于前者,numpy具有roll函数,它与您想要的类似,但它不是用零填充,而是从数组的另一侧复制数据。您可以在之后用零替换它:

>>> a = np.arange(60).reshape(3, 4, 5)
>>> a
array([[[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14],
        [15, 16, 17, 18, 19]],

       [[20, 21, 22, 23, 24],
        [25, 26, 27, 28, 29],
        [30, 31, 32, 33, 34],
        [35, 36, 37, 38, 39]],

       [[40, 41, 42, 43, 44],
        [45, 46, 47, 48, 49],
        [50, 51, 52, 53, 54],
        [55, 56, 57, 58, 59]]])
>>> b = np.roll(a, 2, axis=0)
>>> b[:2,:, :] = 0
>>> b
array([[[ 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,  0,  0,  0],
        [ 0,  0,  0,  0,  0],
        [ 0,  0,  0,  0,  0]],

       [[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14],
        [15, 16, 17, 18, 19]]])

如果转变是负面的,而不是b[:shift, :, :] = 0,那么你会选择b[-shift:, :, :] = 0

如果您不想丢失数据,那么您基本上只是在数组的顶部或底部添加零片。对于前三个维度,numpy有vstackhstackdstack,而vstack应该是您所追求的那个:

>>> a = np.arange(60).reshape(3, 4, 5)
>>> b = np.vstack((np.zeros((2,)+a.shape[1:], dtype=a.dtype), a))
>>> b
array([[[ 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,  0,  0,  0],
        [ 0,  0,  0,  0,  0],
        [ 0,  0,  0,  0,  0]],

       [[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14],
        [15, 16, 17, 18, 19]],

       [[20, 21, 22, 23, 24],
        [25, 26, 27, 28, 29],
        [30, 31, 32, 33, 34],
        [35, 36, 37, 38, 39]],

       [[40, 41, 42, 43, 44],
        [45, 46, 47, 48, 49],
        [50, 51, 52, 53, 54],
        [55, 56, 57, 58, 59]]])

如果您想在底部附加零,只需更改堆叠功能调用中参数的顺序。