我有一个多维数组a:
a = np.random.uniform(1,10,(2,4,2,3,10,10))
对于尺寸4-6,我有3个列表,其中包含用于切割数组“a”的维度的索引
dim4 = [0,2]
dim5 = [3,5,9]
dim6 = [1,2,7,8]
如何切出阵列'a',以便得到:
b = a[0,:,0,dim4,dim5,dim6]
所以b应该是一个形状为(4,2,3,4)的数组,并且包含来自a的相应维度的元素。当我尝试上面的代码时,我得到一个错误,说明不能为4-6轴一起广播不同的形状,但如果我这样做:
b = a[0,:,0:2,0:3,0:4]
然后它确实有效,即使切片列表都有不同的长度。那么如何使用非相邻索引切割多维数组呢?
答案 0 :(得分:3)
您可以使用numpy.ix_
函数来构建这样的复杂索引。它需要array_like
的序列,并从它们制作一个“开放网格”。 docstring中的示例非常清楚:
使用
ix_
可以快速构建将索引的索引数组 十字架产品。a[np.ix_([1,3],[2,5])]
返回数组[[a[1,2] a[1,5]], [a[3,2] a[3,5]]]
。
因此,对于您的数据,您可以:
>>> indices = np.ix_((0,), np.arange(a.shape[1]), (0,), dim4, dim5, dim6)
>>> a[indices].shape
(1, 4, 1, 2, 3, 4)
使用np.squeeze
删除尺寸1尺寸:
>>> np.squeeze(a[indices]).shape
(4, 2, 3, 4)