从列索引中选择二维数组元素的向量

2024-09-28 22:51:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个二维阵列a:

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

以及列索引B的向量数组:

^{pr2}$

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

我应该得到这个2D数组,它包含A的元素,而不是存储在B中的列索引:

28  52
80  66   
7   18    
97  68

Tags: numpy元素方式数组向量pr2pythonian
2条回答

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

设置

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

现在使用广播创建一个掩码,并索引数组。在

^{pr2}$

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

我对你另一个问题的回答

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

我们可以使用前面使用的相同索引创建一个布尔mask

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]])

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

^{pr2}$

在这种情况下,可以将结果重塑回二维:

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

由于您允许使用“基本Python”,下面列出理解答案:

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]]

如果另一个A中的所有0都来自插入,那么我们还可以使用

In [142]: A!=0                                                                                                          
Out[142]: 
array([[ True, False,  True],
       [False,  True,  True],
       [ True,  True, False],
       [False,  True,  True]])

相关问题 更多 >