我有一个二维数组A:
28 39 52
77 80 66
7 18 24
9 97 68
和列索引的矢量数组B:
1
0
2
0
如何以Python的方式,使用基础Python或Numpy,从A中选择与B中的列索引不对应的元素?
我应该得到这个2D数组,它包含A的元素,而不是存储在B中的列索引:
28 52
80 66
7 18
97 68
发布于 2018-09-30 10:14:14
从我对你的另一个问题的回答来看,
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]])
用布尔掩码索引一个数组会产生一个一维数组,因为在最一般的情况下,这样的掩码可以在每一行中选择不同数量的元素。
In [128]: A[mask]
Out[128]: array([28, 52, 80, 66, 7, 18, 97, 68])
在这种情况下,可以将结果重塑为2d:
In [129]: A[mask].reshape(4,2)
Out[129]:
array([[28, 52],
[80, 66],
[ 7, 18],
[97, 68]])
因为你允许使用'base 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都来自插入,那么我们也可以使用以下命令获得mask
(Out[127]
In [142]: A!=0
Out[142]:
array([[ True, False, True],
[False, True, True],
[ True, True, False],
[False, True, True]])
https://stackoverflow.com/questions/52571930
复制相似问题