在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数组的不对称尺寸以及在任何位置返回切片的需求,包括一直环绕以使其具有相同的尺寸作为轴。
为np.arrange
和x
制作了两个y
数组。
在np.roll
数组x轴数组上完成了np.hstack
,递增,np.concatenate
和np.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.diagonal
和np.eye
可能更适合其他人,因为它们可能与我有不同的要求。
答案 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]])