Это должно сделать это.Вы просто генерируете массив vertices
один раз и позволяете вещанию делать все остальное.vertices
дает все 27 возможностей, необходимых для добавления в индекс и получения всех его соседей.
ijk = np.array([2, 3, 4]) # an example point
dim = (10, 10, 10) # dimensions
pts = np.stack(([-1,0,1],)*3,0)
vertices = (np.array(np.meshgrid(*pts)).T).reshape(3**3,3) # a 27x3 array
# the vertices are the points to add to ijk to get all neighbors
n = (vertices + ijk).T # neighbors
n = n.T[((n[0]>=0)&(n[0]<dim[0])
&(n[1]>=0)&(n[1]<dim[1])
&(n[2]>=0)&(n[2]<dim[2]))] # out of bounds elements filtered
Это возвращает
>>> n
array([[1, 2, 3],
[1, 3, 3],
[1, 4, 3],
[2, 2, 3],
[2, 3, 3],
[2, 4, 3],
[3, 2, 3],
[3, 3, 3],
[3, 4, 3],
[1, 2, 4],
[1, 3, 4],
[1, 4, 4],
[2, 2, 4],
[2, 3, 4],
[2, 4, 4],
[3, 2, 4],
[3, 3, 4],
[3, 4, 4],
[1, 2, 5],
[1, 3, 5],
[1, 4, 5],
[2, 2, 5],
[2, 3, 5],
[2, 4, 5],
[3, 2, 5],
[3, 3, 5],
[3, 4, 5]])
Вы можете принудительно ввести это в свой пример вывода с помощью
sorted([int(''.join(x)) for x in n.astype('str')])
, который возвращает
[123,
124,
125,
133,
134,
135,
143,
144,
145,
223,
224,
225,
233,
234,
235,
243,
244,
245,
323,
324,
325,
333,
334,
335,
343,
344,
345]