2017-11-18 246 views
0

我有一个大小为MxN的布尔类型的numpy矩阵A. 比我有一个数组B的ROWSx2在每一行中包含一对坐标x,y。我想找到索引包含在数组A中且其值等于True的矩阵A的坐标列表。 我尝试用这个命令,但它返回一个3D立体阵列,我不明白为什么:查看给定坐标上的点是否为矩阵

intersections = A[A[B] == True] 
+0

添加样品盒? – Divakar

+1

此外,您可能想开始接受您的旧问题的解决方案,或至少发布对他们的某种反馈。我没有看到你方的任何沟通。对于那些花时间回答你的问题的人来说,这看起来不太好。 – Divakar

回答

1

IIUC可以索引到AB有一个元组版本或切片版本,以获得的面具在B有效的坐标,像这样 -

mask = A[tuple(B.T)] #or A[B[:,0], B[:,1]] 

然后,索引B为有效坐标 -

out = B[mask] 

样品运行 -

In [43]: A 
Out[43]: 
array([[False, True, True, True, True], 
     [ True, True, True, False, True], 
     [False, False, False, True, False], 
     [ True, True, True, False, True], 
     [False, True, False, True, True], 
     [False, True, True, True, True]], dtype=bool) 

In [44]: B 
Out[44]: 
array([[5, 4], 
     [1, 3], 
     [4, 4], 
     [5, 4]]) 

In [45]: mask = A[tuple(B.T)] 

# Mask of valid B coordinates 
In [47]: mask 
Out[47]: array([ True, False, True, True], dtype=bool) 

In [46]: B[mask] 
Out[46]: 
array([[5, 4], # [1,3] gone because A[1,3] = False 
     [4, 4], 
     [5, 4]]) 
+0

非常棒!但为什么mask = A [tuple(B.T)]中需要转置? – user1315621

+0

@ user1315621如果运行该示例,则会看到元组输出为:tuple(BT)=(array([5,1,4,5]),array([4,3,4,4])) ',即第一个元组是行索引的元组,第二个元组是col索引,实质上,我们用每个元组索引到'A'的每个轴,以选择元素。 – Divakar