Python 从二维NUMPY阵列中删除多个元素,同时保持其常规形状

Python 从二维NUMPY阵列中删除多个元素,同时保持其常规形状,python,numpy,matrix,match,remove,Python,Numpy,Matrix,Match,Remove,我有两个3D numpy数组,其中每个元素都是一个2D数组,表示一个对象的描述符。我想找到一个数组中与另一个数组中的每个元素最匹配的前两个元素的索引,同时还要确保它们保持一定的条件 我得到了上面提到的索引,这意味着我有两个2D数组,每个数组包含长度为2的数组,这些数组包含这些索引(即第一个数组中的元素0包含以下形状的数组:[a,b]其中a是第二个数组中与其关联度最高的元素的索引,b是第二个数组中关联度第二高的元素的索引) 现在,我想删除所有不匹配的索引,以及表示低于最小值的相关性的所有索引。e、

我有两个3D numpy数组,其中每个元素都是一个2D数组,表示一个对象的描述符。我想找到一个数组中与另一个数组中的每个元素最匹配的前两个元素的索引,同时还要确保它们保持一定的条件

我得到了上面提到的索引,这意味着我有两个2D数组,每个数组包含长度为2的数组,这些数组包含这些索引(即第一个数组中的元素0包含以下形状的数组:[a,b]其中a是第二个数组中与其关联度最高的元素的索引,b是第二个数组中关联度第二高的元素的索引)

现在,我想删除所有不匹配的索引,以及表示低于最小值的相关性的所有索引。e、 g:

  • 第一个数组中的元素0是[2,5]
  • 第二个数组中的元素2是[0,3]
  • 第二个数组中的元素5是[4,2]
  • 然后第一个数组中的元素0与第二个数组中的元素2匹配,但与元素5不匹配-因此我将元素0的值更改为[2]

    另外,如果第一个数组中的元素0和第二个数组中的元素2之间的相关性的实际值小于一个已知常数,那么我也要删除它。 值得一提的是,我还创建了一个关联数组,如下所述

    详细的虚拟示例:

    我从两个3D numpy数组开始,数组中的每个元素都是一个点的2D描述符。 我将使用简单的虚拟数组来解释:

    array 1 : 
    [[[-0.67082039 -0.2236068 ]
      [ 0.2236068   0.67082039]]
    
     [[ 0.67082039  0.2236068 ]
      [-0.2236068  -0.67082039]]]
    
    array 2 : 
    [[[ 0.          0.        ]
      [ 0.          0.        ]]
    
      [[-0.67082039 -0.2236068 ]
      [ 0.2236068   0.67082039]]
    
      [[ 0.58388928  0.40537536]
       [-0.54669888 -0.44256576]]]
    
    现在,我使用一些计算来计算“数组1”中的每个元素与“数组2”中的每个元素的相关性,得到一个2D数组,其中每一行都是与其他数组元素的所有相关性的列表(例如,第0行的新数组,第1列(0,1)显示了“数组1”中的第一个元素与第二个元素的相关性“数组2”)。 虚拟示例继续:

    correlations : 
    [[ 0.          1.         -0.90145725]
     [ 0.         -1.          0.90145725]]
    
    然后,我创建了两个新数组(让我们称它们为“array 1.2”和“array 2.2”),它们保存每个元素到另一个数组的两个顶级相关索引。因此,对于“array 1”中的每个元素,我将在“array 1.2”中有一个新元素,它是一个1D数组,包含两个整数,表示数组2中两个最相关元素的索引。(例如,在下面的虚拟示例中,“数组1”中从“数组2”到元素0的相关性最高的元素是元素1,相关性第二高的元素是元素0) 继续我们的虚拟示例:

    array 1.2 : 
    [[1 0]
     [2 0]]
    
    array 2.2 : 
    [[1 0]
     [0 1]
     [1 0]]
    
    现在,我想删除小于某个值的所有相关性,比如小于0.5,因此我将得到:

    array 1.2 : 
    [[1]
     [2]]
    
    array 2.2 : 
    [[]
     [0]
     [1]]
    
    并删除所有彼此不匹配的索引(在我们的示例中,数组保持不变,因为“array 1.2”中的0表示与“array 2.2”中的1匹配,反之亦然,因此它们都一致-并且它们匹配。“array 1.2”中的1和“array 2.2”中的2也是如此)

    我已经成功地使用循环实现了最后一部分,因为根据条件迭代和更改每一行非常容易,但在我可能使用的较大数组(例如图像)上效率很低

    我试过:

  • 使用numpy索引
  • 使用np.delete和np.where
  • 使用np.take和np.where
  • 使用布尔掩码
  • 我面临的问题都是一样的,我失去了矩阵的结构,它告诉我我在谈论哪个元素


    有什么想法吗?

    第一次快速阅读时,不清楚您所说的结构是什么意思。一个简单的可复制示例(我无法复制粘贴简单数组),以及逐行处理代码可能会有所帮助。并显示某些尝试是如何失败的。将布尔掩码应用于2d数组将返回选定值的1d数组。必须这样做,因为通常这样的掩码每行可以返回不同数量的值。因此它不能返回2d数组。如果您知道它每行返回相同数量的值,则可以重新形状这是你自己做的。