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
的解决方案。但是,您可以在没有 loop
s:
的情况下实现此目的
>>> 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)
如果类似的问题已经以某种方式发布,我很抱歉,但到目前为止我无法在任何地方找到它。我的问题如下:
假设我有一个像这样的 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
的解决方案。但是,您可以在没有 loop
s:
>>> 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)