【问题标题】:Numpy - Searching in a 4D matrix (AKA messed-up meshgrids)Numpy - 在 4D 矩阵中搜索(又名混乱的网格)
【发布时间】:2021-02-15 20:54:46
【问题描述】:

如果已经以某种方式发布了类似的问题,我很抱歉,但到目前为止我在任何地方都找不到。我的问题如下:

假设我有一个像这样的 4D numpy 矩阵

M= array([[[[0.  , 0.  , 0.  ],
            [0.  , 0.  , 0.01]],

           [[0.  , 0.01, 0.  ],
            [0.  , 0.01, 0.01]]],

          [[[0.01, 0.  , 0.  ],
            [0.01, 0.  , 0.01]],

           [[0.01, 0.01, 0.  ],
            [0.01, 0.01, 0.01]]]])

可以将其视为 3D 网格,其中空间中的每个点都是值的三元组(行 / 轴 = 矩阵的 3)。我有另一个 2D np 数组,对应于一组点(在本例中为 2):

Points= array([[0.01, 0.01, 0.], [0., 0., 0.]])

我想查看 M 并找到对应于这些点的坐标或索引。像这样的

coordinates= array([[1,1,0], [0,0,0]])

不幸的是,我必须尽可能避免 for 循环。对于这种情况,我正在寻找相当于 numpy.where() 的方法。

谢谢!

【问题讨论】:

    标签: python numpy parsing array-broadcasting


    【解决方案1】:

    由于this,我没有看到严格的numpy 解决方案。但是,您可以在没有loops 的情况下实现这一点:

    >>> np.vstack([*map(lambda x: np.argwhere(np.equal(M, x).all(-1)), Points)])
    
    array([[1, 1, 0],
           [0, 0, 0]], dtype=int64)
    

    但是,在这种情况下,循环更可取,无论是在速度还是可读性方面

    >>> np.vstack([np.argwhere(np.equal(M, p).all(-1)) for p in Points])
    array([[1, 1, 0],
           [0, 0, 0]], dtype=int64)
    

    或者,

    >>> np.hstack([np.equal(M, p).all(-1).nonzero() for p in Points]).T
    array([[1, 1, 0],
           [0, 0, 0]], dtype=int64)
    

    或者,

    >>> np.array([np.equal(M, p).all(-1).nonzero() for p in Points]).squeeze()
    array([[1, 1, 0],
           [0, 0, 0]], dtype=int64)
    

    时间安排:

    >>> %timeit np.vstack([*map(lambda x: np.argwhere(np.equal(M, x).all(-1)), Points)])
    42.8 µs ± 8.44 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
    
    >>> %timeit np.vstack([np.argwhere(np.equal(M, p).all(-1)) for p in Points])
    33.3 µs ± 840 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
    
    >>> %timeit np.hstack([np.equal(M, p).all(-1).nonzero() for p in Points]).T
    23.1 µs ± 786 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
    
    >>> %timeit np.array([np.equal(M, p).all(-1).nonzero() for p in Points]).squeeze()
    15.9 µs ± 62.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    

    【讨论】:

      猜你喜欢
      • 2020-02-27
      • 2021-01-09
      • 2018-05-24
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      相关资源
      最近更新 更多