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?