Python 如何使用索引向量切片三维数据阵列

Python 如何使用索引向量切片三维数据阵列,python,numpy,multidimensional-array,Python,Numpy,Multidimensional Array,考虑三维numpy阵列: ax1, ax2, ax3 = 3, 3, 2 arr = np.asarray(range(ax1*ax2*ax3)).reshape([ax1, ax2, ax3]) arr: [[[0, 1], [2, 3], [4, 5]], [[6, 7], [8, 9], [10, 11]], [[12, 13], [14, 15], [16, 17]]] 和一个索引向量idx=[0,1,2] 我想通过以下语句使用idx对数组arr进行切片: re

考虑三维numpy阵列:

ax1, ax2, ax3 = 3, 3, 2
arr = np.asarray(range(ax1*ax2*ax3)).reshape([ax1, ax2, ax3])
arr: [[[0, 1], [2, 3], [4, 5]],
      [[6, 7], [8, 9], [10, 11]],
      [[12, 13], [14, 15], [16, 17]]]
和一个索引向量
idx=[0,1,2]

我想通过以下语句使用
idx
对数组
arr
进行切片:

res = [arr[i, :idx[i]+1] for i in range(ax1)]
res: [[[0, 1]],
      [[6, 7], [8, 9],
      [[12, 13], [14, 15], [16, 17]]]
但是这种切片看起来很复杂

numpy是否支持这种不使用循环的操作?
我正在寻找类似于
arr[range(ax1),:idx+1]
的东西,这里有一种矢量化方法,假设
arr
idx
为NumPy数组-

np.split(arr[np.arange(arr.shape[0]) <= idx[:,None]],(idx+1).cumsum())[:-1]

np.split(arr[np.arange(arr.shape[0])您的问题是结果值不是矩形的:您无法将其正确表示为数组

如果您对仅使用不同格式的值感到满意,您可以通过以下方式获得所需:

原则是,对于[0;2]^2中的每一对索引,您都要传递是否应获取该对索引:

>>> np.tri(3, 3, dtype=bool)
array([[ True, False, False],
       [ True,  True, False],
       [ True,  True,  True]], dtype=bool)
这就引出了极其简洁的:

>>> arr[np.tri(3, 3, dtype=bool)]
array([[ 0,  1],
       [ 6,  7],
       [ 8,  9],
       [12, 13],
       [14, 15],
       [16, 17]])

寻找“简单”解决方案的任何特殊原因?性能方面的效率是相关问题吗?我只想寻找不使用循环的numpy切片操作。您的
idx
是否总是
[0,1,2]
>>> np.tri(3, 3, dtype=bool)
array([[ True, False, False],
       [ True,  True, False],
       [ True,  True,  True]], dtype=bool)
>>> arr[np.tri(3, 3, dtype=bool)]
array([[ 0,  1],
       [ 6,  7],
       [ 8,  9],
       [12, 13],
       [14, 15],
       [16, 17]])