Python NumPy-3D阵列的倾斜切片

时间:2019-02-18 07:31:25

标签: python arrays numpy numpy-ndarray numpy-slicing

在NumPy中工作,我了解如何使用this article从3D阵列中切片2D阵列。

取决于要切入的轴:

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]]]

切片会给我:

i_slice = array[0]

    [[0  1  2]
     [3  4  5]
     [6  7  8]]

j_slice = array[:, 0]

    [[0  1  2]
     [9  10 11]
     [18 19 20]]

k_slice = array[:, :, 0]

    [[0  3  6]
     [9  12 15]
     [18 21 24]]

但是可以以45度角切片吗?,例如:

j_slice_down = array[slice going down starting from index 0]

    [[0  1  2]
     [12 13 14]
     [24 25 26]]

我能够在所有3轴的上升或下降中实现这一点,甚至可以一直包裹着……在黑暗的日子里,有很多for循环……但我敢肯定,肯定会有更好的选择NumPy中的方式。

更新,选择答案:

我选择了hpaulj的答案,它使用np.arrange创建了两个坐标数组。只需做一些工作,我就可以满足我以任何角度,在任何轴上,在3D数组的不对称尺寸以及在任何位置返回切片的需求,包括一直环绕以使其具有相同的尺寸作为轴。

My method using np.arrange

np.arrangex制作了两个y数组。

np.roll数组x轴数组上完成了np.hstack,递增,np.concatenatenp.arrange等不同的方法。 y = y[::-1]为备用角度。

if axis is 'z': #i
    slice_notation = np.index_exp[x, y, :] 

elif axis is 'y': #k
    slice_notation = np.index_exp[x, :, y]

else: #j 
    slice_notation = np.index_exp[:, x, y]

创建切片表达式,然后使用slice_notation就地执行所需的操作。

其他建议的方法:np.diagonalnp.eye可能更适合其他人,因为它们可能与我有不同的要求。

2 个答案:

答案 0 :(得分:2)

您可以尝试使用np.diagonal

arr = np.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]]])

np.diagonal(arr).T
array([[ 0,  1,  2],
       [12, 13, 14],
       [24, 25, 26]])

答案 1 :(得分:2)

In [145]: arr[np.arange(3), np.arange(3),:]
Out[145]: 
array([[ 0,  1,  2],
       [12, 13, 14],
       [24, 25, 26]])