Вы можете использовать product
на enumerate
ваших векторов, что даст значение и индекс:
for ((i,v1),(j,v2),(k,v3)) in itertools.product(enumerate(x1),enumerate(x2),enumerate(x3)):
if round(np.sqrt(v1**2+v2**2+v3**2)) in ranges:
funcspace[i][j][k]=1
в качестве бонуса, вы избавитесь от непифонической конструкции range(len())
.
Я подготовил более общий случай, когда у вас есть вектор векторов.Это немного сложнее читать, потому что распаковка не выполняется в цикле for
.
Квадратная сумма выполняется с использованием sum
для 1 индекса (значения), и если условие соответствует, мыЦикл пока мы не найдем «более глубокий» список, чтобы установить значение 1
.
for t in itertools.product(*(enumerate(x) for x in x_list)):
# compute the squared sum of values
sqsum = sum(v[1]**2 for v in t)
if round(sqsum) in ranges:
# traverse the dimensions except the last one
deeper_list = funcspace
for i in range(len(t)-1):
deeper_list = deeper_list[t[i][0]]
# set the flag using the last dimension list
deeper_list[t[-1][0]] = 1
, как отмечено в комментариях, так как x1
, кажется, повторяется, вы можете заменить первое утверждение на:
for t in itertools.product(enumerate(x1), repeat=dim):
В других комментариях говорится, что, поскольку funcspace
- пустая цифра ndarray
, мы можем упростить цикл «set to 1», передав список индексов:
funcspace[[x[0] for x in t]] = 1