在 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 阵列的非对称维度和任何位置返回切片,包括一直环绕以使其具有相同的维度作为轴。
为 x
和 y
创建了两个 np.arrange
数组。
np.roll
、incrementing、np.hstack
和np.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.diagonal
和 np.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/