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

标签 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

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

np.roll、incrementing、np.hstacknp.concatenate 等不同的方法都是在np.排列 数组 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 可能更适合其他人,尽管他们可能有与我不同的要求。

最佳答案

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

关于Python NumPy - 3D 数组的角度切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54742326/

相关文章:

python - 将计算列添加到 Pandas 数据框

python - 如何拆分字符串输入并 append 到列表? Python

python - 取最近N天的平均值

python - 过滤 numpy 数组以仅保留给定值的一行

C:在一个数组中切换两个结构

python xarray 索引/切片非常慢

python - 编写一组将使用存储在其他地方的数据的函数

python - 如何删除行和列的索引名称? (轴=0 & 轴=1)

java - 如何在数组中存储新的客户端信息并能够在java中再次查看它?

c# - BitmapImage:访问关闭的 StreamSource