python中numpy多维数组的非相邻切片

时间:2017-09-20 15:17:34

标签: python arrays numpy multidimensional-array slice

我有一个多维数组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]

然后它确实有效,即使切片列表都有不同的长度。那么如何使用非相邻索引切割多维数组呢?

1 个答案:

答案 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)