Python - cómo para bucle un array de no 0, sino xth elemento?

Tengo un for lazo como este

ImgPaths = make_dataset(TestImgPath)
    for i, ImgPath in enumerate(ImgPaths):

En que:

  • TestImgPath es el camino para introducir imágenes. Tipo de String. En mi caso TestImgPath = './TestData/TestWhole'. TestData y TestWhole son carpetas.
  • ImgPath es el camino a la imagen. Por ejemplo ImgPath = ./TestData/TestWhole\XXXXX.jpg cuando imploro. XXXXX es de 00000 a 82700 en mi caso
  • ImgPath es el camino a las imágenes de inmediato. Por ejemplo ImgPaths = ./TestData/TestWhole\\XXXXX.jpg cuando imploro. Pero creo que es todo el 00000-XXXXX en uno, desde ImgPaths se asigna como arriba.

Por lo tanto, hay 82700 archivos para manejar, y toma 24 segundos para un archivo. Espera que se haga completamente a la vez es demasiado largo. La carpeta padre es grande así que no puedo duplicar la carpeta padre en 10 copias y ejecutar cada copia. Así que dividiendo eso for El bucle puede ser el camino a seguir. Parece que no es normal for loop pero un array for bucle.

Así que, cómo hacer un array for ¿Empieza el bucle y para en un determinado elemento? Si quiero empezar desde 11111.jpg y parar en 22222.jpg, ¿cómo hacerlo?

Este es el código fuente https://drive.google.com/file/d/1jnE7kSK2eyXEAsTXb_4IctUEbBkZSWJa/view?usp=sharing

Gracias.

Pregunta hecha hace 3 años, 4 meses, 29 días - Por quantumquasar


3 Respuestas:

  • Usted puede utilizar una declaración condicional para evitar el procesamiento hasta i alcanza el número de inicio deseado, y luego break el bucle cuando i supera el número final:

    for i, ImgPath in enumerate(ImgPaths):
        if i > 22222:
            break
        elif i >= 11111:
            # process ImgPath
    

    o uso itertools.islice para limitar las iteraciones al rango especificado:

    import itertools
    for ImgPath in itertools.islice(ImgPaths, 11111, 22222 + 1):
        # process ImgPath
    

    Respondida el Dec 17, 2020 a las 04:11 - por devepicenter

    Votos positivos: 0 | Votos negativos: 0

  • Para lograr lo que buscas, puedes modificar el for loop usando un rango de índices en lugar de iterar sobre todos los elementos del array ImgPaths. Aquí te muestro un ejemplo de cómo puedes hacerlo para empezar desde 11111.jpg y parar en 22222.jpg:

    python
    ImgPaths = make_dataset(TestImgPath)
    start_index = 11111
    end_index = 22223  

    Se incluirá el 22222.jpg

    for i in range(start_index, end_index): ImgPath = ImgPaths[i]

    Tu código para procesar la imagen aquí

    En el código anterior, estamos generando un rango de índices desde start_index hasta end_index, y luego accediendo a los elementos de ImgPaths con esos índices. Esto te permitirá ejecutar el bucle solo para los elementos que te interesan, en este caso, desde 11111.jpg hasta 22222.jpg.

    Espero que esta solución te sea de ayuda. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 18, 2020 a las 04:10 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para iterar sobre un rango de elementos en una lista, puedes usar la sintaxis de rebanada en Python. La sintaxis de rebanada te permite seleccionar un subconjunto de elementos de una lista especificando el índice inicial y final.

    En tu caso, puedes utilizar la siguiente sintaxis para iterar sobre los elementos de ImgPaths desde el índice 11111 hasta el índice 22222:

    python
    ImgPaths = make_dataset(TestImgPath)
    for i, ImgPath in enumerate(ImgPaths[11111:22223]):
        

    Tu código aquí

    Ten en cuenta que el índice final (22223) se especifica como exclusivo, por lo que el bucle se detendrá en el elemento 22222.

    También puedes utilizar la función range() para generar un rango de índices para iterar:

    python
    ImgPaths = make_dataset(TestImgPath)
    for i in range(11111, 22223):
        ImgPath = ImgPaths[i]
        

    Tu código aquí

    Espero que esto resuelva tu problema. Déjame saber si tienes alguna otra pregunta.

    Respondida el Dec 18, 2020 a las 04:24 - por Gemini

    Votos positivos: 0 | Votos negativos: 0