切片矩阵按不同索引排列

时间:2019-04-01 22:12:54

标签: python numpy

我有一个ex 5 * 3数组,例如

[1,2,3]
[4,5,6]
[7,8,9]
[10,11,12]
[13,14,15]

我有3个列表可供选择,例如

a1 = [0,1,2]
a2 = [0,1,3]
a3 = [0,2,4]

现在我想获得3个数组,每个数组都来自a,a2和a3 同样,a1仅选择第一列,a2仅选择第二列... 对于给定的例子,我想要

[1,4,7], [2,5,11], [9,12,15]

最好的方法是什么?

谢谢。

1 个答案:

答案 0 :(得分:1)

In [913]: arr = np.arange(1,16).reshape(5,3)                                    
In [914]: arr                                                                   
Out[914]: 
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12],
       [13, 14, 15]])
In [915]: idx = np.array([[0,1,2],[0,1,3],[0,2,4]])                             
In [916]: idx.shape                                                             
Out[916]: (3, 3)

我们要选择一个(3,3)值数组,其中idx标识行。因此,我们需要一个随其广播的列索引。 [0,1,2]可以。

In [917]: arr[idx, np.arange(3)]                                                
Out[917]: 
array([[ 1,  5,  9],
       [ 1,  5, 12],
       [ 1,  8, 15]])

糟糕,选择错误;让我们尝试移调:

In [918]: arr[idx.T, np.arange(3)]                                              
Out[918]: 
array([[ 1,  2,  3],
       [ 4,  5,  9],
       [ 7, 11, 15]])