基本的に、多次元配列のインデックス付けスキームを再発明しています。コーディングは比較的簡単ですが、2 つの関数unravel_index
を使用しravel_multi_index
て、ここで有利に働くことができます。
グリッドがM
行と列で構成されている場合、単一のアイテムのandN
を取得するには、次のようにします。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