Lo descubrí por mi cuenta, así que aquí hay una explicación para cualquier persona futura que esté confundida por esto.
A modo de ejemplo, vamos a usar la sencilla entramado de puntos que los que estaba trabajando en mi código, que genero la siguiente manera
import numpy as np
import itertools as it
from matplotlib import pyplot as plt
import scipy as sp
inputs = list(it.product([0,1,2],[0,1,2]))
i = 0
lattice = range(0,len(inputs))
for pair in inputs:
lattice[i] = mksite(pair[0], pair[1])
i = i +1
detalles aquí realmente no es importante, es suficiente decir que genera un triangular periódica celosía en el que la distancia entre un punto y cualquiera de sus seis vecinos más cercanos es 1.
Para representar que
plt.plot(*np.transpose(lattice), marker = 'o', ls = '')
axes().set_aspect('equal')

Ahora calcular la triangulación:
dela = sp.spatial.Delaunay
triang = dela(lattice)
Veamos lo que esto nos da.
triang.points
salida:
array([[ 0. , 0. ],
[ 0.5 , 0.8660254 ],
[ 1. , 1.73205081],
[ 1. , 0. ],
[ 1.5 , 0.8660254 ],
[ 2. , 1.73205081],
[ 2. , 0. ],
[ 2.5 , 0.8660254 ],
[ 3. , 1.73205081]])
simple, sólo un conjunto de los nueve puntos de la retícula se ilustra arriba. Como vamos a ver:
triang.vertices
de salida:
array([[4, 3, 6],
[5, 4, 2],
[1, 3, 0],
[1, 4, 2],
[1, 4, 3],
[7, 4, 6],
[7, 5, 8],
[7, 5, 4]], dtype=int32)
En esta matriz, cada fila representa una simple (triángulo) en la triangulación. Las tres entradas en cada fila son los índices de los vértices de ese símplex en la matriz de puntos que acabamos de ver. Así, por ejemplo la primera simplex en esta matriz, [4, 3, 6]
se compone de los puntos:
[ 1.5 , 0.8660254 ]
[ 1. , 0. ]
[ 2. , 0. ]
Es fácil ver esto dibujando la red en un trozo de papel, el etiquetado de cada punto de acuerdo a su índice, y luego trazando a través de cada fila en triang.vertices
.
Esta es toda la información que necesitamos para escribir la función que especifiqué en mi pregunta. Parece que :
def find_neighbors(pindex, triang):
neighbors = list()
for simplex in triang.vertices:
if pindex in simplex:
neighbors.extend([simplex[i] for i in range(len(simplex)) if simplex[i] != pindex])
'''
this is a one liner for if a simplex contains the point we`re interested in,
extend the neighbors list by appending all the *other* point indices in the simplex
'''
#now we just have to strip out all the dulicate indices and return the neighbors list:
return list(set(neighbors))
Y eso es todo! Estoy seguro de que la función anterior podría funcionar con alguna optimización, es solo lo que se me ocurrió en unos minutos. Si alguien tiene alguna sugerencia, no dude en publicarla. Espero que esto ayude a alguien en el futuro que está tan confundido acerca de esto como yo.
¡No importa, me di cuenta! –
En Stack Overflow, ayudamos a las personas a [responder sus propias preguntas] (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/). ¿Podría hacer el esfuerzo de responder su propia pregunta y marcarla como resuelta (marcando la casilla a la izquierda de su respuesta)? – Sicco
intentado, aparentemente los usuarios con menos de 10 de reputación no pueden responder sus propias preguntas durante 8 horas después de la publicación:/Guardaré lo que escribí en un archivo txt y esperaré hasta esta noche para publicarlo. –