代码之家  ›  专栏  ›  技术社区  ›  Roman

如何使用numpy或Theano将矩阵的整数值用作另一个矩阵的索引?

  •  2
  • Roman  · 技术社区  · 9 年前

    我有以下4个相同形状的矩阵:(1)一个矩阵 I 包含整数值,(2)矩阵 J 包含整数值,(3)矩阵 D 包含浮点值和(4)矩阵 V 包含浮点值。

    我想使用这4个矩阵以以下方式构造“输出”矩阵:

    1. 要查找元素的值,请执行以下操作: i , j 在输出矩阵中,找到矩阵的所有单元格(元素) 等于 以及矩阵的所有单元(元素) J 等于 j .
    2. 只使用满足这两个条件的单元格(记住矩阵 J 具有相同的形状)。
    3. 在“选定”单元格中搜索值最小的单元格 D .
    4. 取找到的单元格(最小值为D),并检查其在矩阵中的值 五、 .

    , j 输出矩阵的元素。我为所有人做这件事 is js .

    我想使用numpy或Theano来解决这个问题。

    当然,我可以循环所有I_s和j_s,但我认为(希望)应该有一种更有效的方法。

    补充

    根据要求,我提供了一个例子:

    这里是矩阵I:

     0   1   2
     1   1   0
     0   0   2
    

    这里是矩阵J:

     1   1   1
     1   2   1
     0   1   0
    

    这里是矩阵D:

     1.2   3.4   2.2
     2.2   4.3   2.3
     7.1   6.1   2.7
    

    最后我们得到矩阵V:

     1.1   8.1   9.1
     3.1   7.1   2.1
     0.1   5.1   3.1
    

    如您所见,所有4个矩阵都具有相同的形状(3 x 4),但它们可以具有其他形状(例如2 x 5)。主要的是,所有4个矩阵的形状都相同。

    因此,输出矩阵应该有3行。同样,我们可以得出结论,输出矩阵应该有3列(因为矩阵的值 J 也为0至2)。

    让我们首先找到输出矩阵的元素(0,1)。在 矩阵以下单元格(用x标记)包含0。

     x   .   .
     .   .   x
     x   x   .
    

    在矩阵中 J 以下元素包含1:

     x   x   x
     x   .   x
     .   x   .
    

    这两组单元格的交集为:

     x   .   .
     .   .   x
     .   x   .
    

    相应的距离为:

     1.2    .     . 
      .     .    2.3
      .    6.1    . 
    

    因此,最小距离位于左上角。因此,我们从矩阵的左上角取值 五、 (该值为1.1)。

    这就是我们如何找到输出矩阵的(0,1)元素的值。我们对所有可能的索引组合(总共有3 x 3=9)执行相同的过程。对于某些组合,我们找不到任何值,在这种情况下,我们将值设置为 nan .

    1 回复  |  直到 9 年前
        1
  •  2
  •   Divakar    9 年前

    这是一种矢量化方法,使用 broadcasting -

    # Get mask of matching elements against the iterators
    m,n = I.shape
    Imask = I == np.arange(m)[:,None,None,None]
    Jmask = J == np.arange(n)[:,None,None]
    
    # Get the mask of intersecting ones
    mask = Imask & Jmask
    
    # Get D intersection masked array
    Dvals = np.where(mask,D,np.inf)
    
    # Get argmin along merged last two axes. Index into flattened V for final o/p
    out = V.ravel()[Dvals.reshape(m,n,-1).argmin(-1)]
    

    样本输入、输出-

    In [136]: I = np.array([[0,1,2],[1,1,0],[0,0,2]])
         ...: J = np.array([[1,1,1],[1,2,1],[0,1,0]])
         ...: D = np.array([[1.2, 3.4, 2.2],[2.2, 4.3, 2.3],[7.1, 6.1, 2.7]])
         ...: V = np.array([[1.1 , 8.1, 9.1],[3.1, 7.1, 2.1],[0.1, 5.1, 3.1]])
         ...: 
    
    In [144]: out
    Out[144]: 
    array([[ 0.1,  1.1,  1.1], # To verify : v[0,1] = 1.1
           [ 1.1,  3.1,  7.1],
           [ 3.1,  9.1,  1.1]])