En la captura de pantalla adjunta, los atributos contienen dos campos de interés "a" y "b". Quiero escribir un script para acceder a las filas adyacentes para hacer algunos cálculos. Para acceder a una sola fila, usaría el siguiente UpdateCursor:
fc = r'C:\path\to\fc'
with arcpy.da.UpdateCursor(fc, ["a", "b"]) as cursor:
for row in cursor:
# Do something
Por ejemplo, con OBJECTID 4, estoy interesado en calcular la suma de los valores de fila en el campo "a" adyacente a la fila de OBJECTID 4 (es decir, 1 + 3) y agregar ese valor a la fila de OBJECTID 4 en el campo "b". ¿Cómo puedo acceder a las filas adyacentes con el cursor para hacer este tipo de cálculos?
fuente
OBJECTID
esta solución puede identificar vecinos de manera confiable de acuerdo con los valores de esa clave. Sin embargo, los diccionarios no suelen admitir una búsqueda "siguiente" o "anterior". Necesitas algo como un Trie .Mientras recorre las filas, debe realizar un seguimiento de los valores anteriores. Esta es un forma de hacerlo:
o, si la tabla no es enorme, probablemente construiría un diccionario, como d = {a: b} y luego, en el cursor de actualización, acceda a los datos del diccionario: d.get (a + 1) o d.get (a -1) para hacer los cálculos ..
fuente
Acepté la respuesta de @Hornbydd por guiarme hacia una solución de diccionario. El script adjunto realiza las siguientes acciones:
fuente
El módulo de acceso a datos es bastante rápido y puede crear un
SearchCursor
para guardar todos los valores de 'a' en una lista y luego crear unUpdateCursor
para recorrer cada fila y seleccionar de la lista para actualizar las filas 'b' necesarias. De esta manera, no necesita preocuparse por guardar datos entre filas =)Entonces algo como esto:
Esta es una solución bastante cruda, pero la utilicé recientemente para solucionar un problema muy similar. Si el código no funciona con suerte, ¡te pone en el camino correcto!
Editar: Modificado en último lugar si la declaración de AND a OR Edit2: Modificado de nuevo. ¡Ah, la presión de mi primera publicación de StackExchange!
fuente
aList
lugar de agregar cada entrada. 2) Use enenumerate()
lugar de tener un contador separado para el índice.Primero necesitas un cursor de búsqueda; No creo que pueda obtener valores con un cursor de actualización. Luego, en cada iteración, use aNext = row.next (). GetValue ('a') para obtener el valor de la siguiente fila.
Para obtener el valor de la fila anterior, establecería una variable fuera del ciclo for igual a cero. Esto se actualiza para igualar el valor actual de las filas de 'a'. Luego puede acceder a esta variable en la próxima iteración.
Esto satisfaría su ecuación de B = A (rowid-1) + A (rowid + 1)
fuente
fieldA
y usarlo para calcular un nuevo valor parafieldB
.)