你基本上是重新创建多维数组的索引方案。编码相对容易,但您可以在这里使用两个函数unravel_index
和ravel_multi_index
。
如果您的网格是M
行和N
列,得到idx
和单个项目的idy
你可以这样做:
>>> M, N = 12, 10
>>> np.unravel_index(4, dims=(M, N))
(0, 4)
这也适用,如果,而不是一个单一的指标,你提供了一个数组索引:
>>> np.unravel_index([15, 28, 32, 97], dims=(M, N))
(array([1, 2, 3, 9], dtype=int64), array([5, 8, 2, 7], dtype=int64))
所以,如果cells
有几个小区的索引你想找到邻居:
>>> cells = np.array([15, 28, 32, 44, 87])
你可以得到他们的邻居为:
>>> idy, idx = np.unravel_index(cells, dims=(M, N))
>>> neigh_idx = np.vstack((idx-1, idx+1, idx, idx))
>>> neigh_idy = np.vstack((idy, idy, idy-1, idy+1))
>>> np.ravel_multi_index((neigh_idy, neigh_idx), dims=(M,N))
array([[14, 27, 31, 43, 86],
[16, 29, 33, 45, 88],
[ 5, 18, 22, 34, 77],
[25, 38, 42, 54, 97]], dtype=int64)
或者,如果你喜欢它这样:
>>> np.ravel_multi_index((neigh_idy, neigh_idx), dims=(M,N)).T
array([[14, 16, 5, 25],
[27, 29, 18, 38],
[31, 33, 22, 42],
[43, 45, 34, 54],
[86, 88, 77, 97]], dtype=int64)
要不要去这样的最美好的事情是,ravel_multi_index
有mode
关键字参数您可以使用它来处理网格边缘的物品,请参阅文档。
我认为你可以通过使用NumPy花式索引加速它。你能发布更多的代码来创建'idx,idy,cells,idx_cells,x'。 – HYRY 2013-03-28 10:56:16
您也许可以使用scipy的cKDTree。 http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.cKDTree.html – Daniel 2013-03-28 13:33:15
谢谢我已经尝试过使用KDTree,但是对于我的数据集来说它相当慢,而且对于一个网格。不幸的是我不能发布更多的代码,因为我的数据集很大。 – Brian 2013-03-28 13:35:45