2013-04-09 172 views
1

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

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

谢谢!

+0

你可以发布你的尝试到目前为止,让我们知道你遇到了什么错误吗? – Ren 2013-04-09 08:14:50

+0

请参阅http://stackoverflow.com/questions/2777907/python-numpy-roll-with-padding – YXD 2013-04-09 09:49:35

+0

你又是什么意思“但我正在工作的系统不能识别所有的numpy功能”? – YXD 2013-04-09 10:12:32

回答

3

你的问题有点不明确。首先,“高度”轴并不是一个非常明确的定义,您在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的有vstackhstack,并且dstack,并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]]]) 

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