使用列索引向量将 2D 数组元素替换为零



>我有一个 2D 数组 A:

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

和列索引 B 的向量数组:

1   
0   
2    
0

如何以 pythonian 的方式,使用 base python 或 numpy,用零替换 A 中每行上对应于 B 中列索引的元素?

我应该得到以下新数组 A,每行都有一个元素(存储在 B 中的列索引中的元素(,替换为零:

28   0  52
0  80  66   
7  18   0    
0  97  68

感谢您的帮助!

这是一个使用enumerate的简单 pythonian 方法:

for i, j in enumerate(B):
A[i][j] = 0
In [117]: A = np.array([[28,39,52],[77,80,66],[7,18,24],[9,97,68]])                                                     
In [118]: B = [1,0,2,0]                                                                                                 

要从每行中选择一个元素,我们需要使用与B匹配的数组索引行:

In [120]: A[np.arange(4),B]                                                                                             
Out[120]: array([39, 77, 24,  9])

我们可以通过以下方式设置相同的元素:

In [121]: A[np.arange(4),B] = 0                                                                                         
In [122]: A                                                                                                             
Out[122]: 
array([[28,  0, 52],
[ 0, 80, 66],
[ 7, 18,  0],
[ 0, 97, 68]])

这最终会用索引 (0,1(、(1,0(、(2,2(、(3,0( 为点编制索引。

基于列表的"转置"生成相同的对:

In [123]: list(zip(range(4),B))                                                                                         
Out[123]: [(0, 1), (1, 0), (2, 2), (3, 0)]

最新更新