vistas tipos modelo estructura diccionario datos crear campos python multidimensional-array iteration

python - modelo - tipos de campos odoo



¿Cómo iterar sobre este conjunto de datos n-dimensional? (1)

Puede usar itertools.product para iterar sobre el producto cartesiano 1 de algunos valores (en este caso los índices):

import itertools shape = [4,5,2,6] for idx in itertools.product(*[range(s) for s in shape]): value = dataset[idx] print(idx, value) # i would be "idx[0]", j "idx[1]" and so on...

Sin embargo, si se trata de una matriz numpy que desea iterar, podría ser más fácil usar np.ndenumerate :

import numpy as np arr = np.random.random([4,5,2,6]) for idx, value in np.ndenumerate(arr): print(idx, value) # i would be "idx[0]", j "idx[1]" and so on...

1 Usted solicitó una aclaración sobre qué itertools.product(*[range(s) for s in shape]) realmente lo hace. Entonces lo explicaré en más detalles.

Por ejemplo, tienes este bucle:

for i in range(10): for j in range(8): # do whatever

Esto también se puede escribir usando product como:

for i, j in itertools.product(range(10), range(8)): # ^^^^^^^^---- the inner for loop # ^^^^^^^^^-------------- the outer for loop # do whatever

Eso significa que el product es solo una forma práctica de reducir el número de bucles for independientes .

Si desea convertir un número variable de bucles en un product , básicamente necesita dos pasos:

# Create the "values" each for-loop iterates over loopover = [range(s) for s in shape] # Unpack the list using "*" operator because "product" needs them as # different positional arguments: prod = itertools.product(*loopover) for idx in prod: i_0, i_1, ..., i_n = idx # index is a tuple that can be unpacked if you know the number of values. # The "..." has to be replaced with the variables in real code! # do whatever

Eso es equivalente a:

for i_1 in range(shape[0]): for i_2 in range(shape[1]): ... # more loops for i_n in range(shape[n]): # n is the length of the "shape" object # do whatever

Tengo un dataset que tiene 4 dimensiones (por ahora ...) y necesito iterar sobre él.

Para acceder a un valor en el dataset , hago esto:

value = dataset[i,j,k,l]

Ahora puedo obtener la shape del dataset :

shape = [4,5,2,6]

Los valores en shape representan la longitud de la dimensión.

¿Cómo, dado el número de dimensiones, puedo iterar sobre todos los elementos en mi conjunto de datos? Aquí hay un ejemplo:

for i in range(shape[0]): for j in range(shape[1]): for k in range(shape[2]): for l in range(shape[3]): print(''BOOM'') value = dataset[i,j,k,l]

En el futuro, la shape puede cambiar. Entonces, por ejemplo, la shape puede tener 10 elementos en lugar de la actual 4.

¿Hay alguna manera agradable y limpia de hacer esto con Python 3?