Python 如何使用索引向量切片三维数据阵列
考虑三维numpy阵列: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
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]])