Numpy - 在 4D 矩阵中搜索(又名混乱的网格)

Numpy - Searching in a 4D matrix (AKA messed-up meshgrids)

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

假设我有一个像这样的 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 网格,其中 space 中的每个点都是值的三元组(矩阵的行/轴=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() 的等价物。

谢谢!

由于 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)