我有一个二维数组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
答案 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都来自插入,那么我们也可以通过以下方式获得A
(mask
)
Out[127]