Python NumPy - 3D 数组的角度切片

Posted

技术标签:

【中文标题】Python NumPy - 3D 数组的角度切片【英文标题】:Python NumPy - angled slice of 3D array 【发布时间】:2019-07-11 13:04:30 【问题描述】:

在 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 个轴的上升或下降中实现这一点,甚至一直环绕...在 NumPy 中的方式。

更新,选择答案:

我选择了 hpaulj 的答案,用np.arrange 创建了两个坐标数组。通过一些工作,我能够满足我在任何角度、任何轴、3D 数组的不对称维度和任何位置返回切片的需要,包括一直环绕以使其具有相同的维度作为轴。

xy 创建了两个np.arrange 数组。

np.roll、递增、np.hstacknp.concatenate 等不同方法在 np.arrange 数组 x 轴数组上完成。 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 可能更适合其他人,尽管他们的要求可能与我不同。

【问题讨论】:

a[np.eye(len(a),dtype=bool)]a 作为输入数组? 哇..@Divakar!这给了我示例结果。让我进一步研究 np.eye。谢谢! 另一个einsum,应该更高效:np.einsum('iij->ij',a) 【参考方案1】:
In [145]: arr[np.arange(3), np.arange(3),:]
Out[145]: 
array([[ 0,  1,  2],
       [12, 13, 14],
       [24, 25, 26]])

【讨论】:

虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。 对于小切片范围,我喜欢这种排列方式,因为您可以排列切片以适应扩展...例如。 a[[0,1,2],[0,1,2],:] 或 ... a[[2,1,0],[0,1,2],:] @hpaulj - 这似乎是我正在寻找的。因此,我可以通过将 np.arange 放置在除您的示例之外的其他位置来将其应用于所有轴。此外,反转 np.arange 的输出允许我选择另一个方向并从负数开始允许我创建环绕选择。 这对我的使用最有用,因为我想使用切片对 3D 数组执行操作,而不是从数组中提取切片。我会玩得更远,如果成功,我会提供一些例子并接受这个答案。 np.where(np.eye(3)) 产生这两个范围,所以我的回答与@Divakar 的eye 评论有关。【参考方案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]])

【讨论】:

np.diagonal 将axis1和axis2作为kwargs。它们让您选择返回 arr 的哪个对角线切片。

以上是关于Python NumPy - 3D 数组的角度切片的主要内容,如果未能解决你的问题,请参考以下文章

NumPy:在 3D 切片中使用来自 argmin 的 2D 索引数组

从 3D Numpy 数组的一维切片 [重复]

在numpy中获取3D数组的2D切片的平均值

对比 Python 原生切片,讲述 Numpy 数组切片!

Python中numpy 数组的切片操作

乐哥学AI_Python:Numpy索引,切片,常用函数