从列索引向量中选择2D数组元素的向量

时间:2018-09-29 19:43:11

标签: python arrays numpy

我有一个二维数组A:

await

还有列索引B的向量数组:

28  39  52
77  80  66   
7   18  24    
9   97  68

如何以Python方式使用基本Python或Numpy,从A中选择与B中的列索引不对应的元素?

我应该得到一个二维数组,其中包含A的元素,不对应于存储在B中的列索引:

1   
0   
2    
0

2 个答案:

答案 0 :(得分:3)

您可以利用广播和逐行掩码为每一行选择数组中未包含的元素:

设置

B = np.array([1, 0, 2, 0])
cols = np.arange(A.shape[1])

现在使用广播创建蒙版,并为阵列建立索引。

mask = B[:, None] != cols
A[mask].reshape(-1, 2)

array([[28, 52],
       [80, 66],
       [ 7, 18],
       [97, 68]])

答案 1 :(得分:1)

从我对您的其他问题的回答中剥离出来

Replace 2D array elements with zeros, using a column index vector

我们可以使用之前使用的相同索引来创建布尔值PrintStream

mask

使用布尔掩码对数组进行索引会生成一个1d数组,因为在大多数情况下,这样的掩码可以在每一行中选择不同数量的元素。

In [124]: mask = np.ones(A.shape, dtype=bool)                                                                           
In [126]: mask[np.arange(4), B] = False                                                                                 
In [127]: mask                                                                                                          
Out[127]: 
array([[ True, False,  True],
       [False,  True,  True],
       [ True,  True, False],
       [False,  True,  True]])

在这种情况下,结果可以重新调整为2d:

In [128]: A[mask]                                                                                                       
Out[128]: array([28, 52, 80, 66,  7, 18, 97, 68])

由于您允许使用“基本Python”,因此这里的列表理解答案是:

In [129]: A[mask].reshape(4,2)                                                                                          
Out[129]: 
array([[28, 52],
       [80, 66],
       [ 7, 18],
       [97, 68]])

如果另一个In [136]: [[y for i,y in enumerate(x) if i!=b] for b,x in zip(B,A)] Out[136]: [[28, 52], [80, 66], [7, 18], [97, 68]] 中的所有0都来自插入,那么我们也可以通过以下方式获得Amask

Out[127]