Создайте словарь вложенных кубов из большего куба в Python

#python-3.x

#python-3.x

Вопрос:

Я изучаю каждый непрерывный куб размером 8 x 8 x 8 в кубе размером 50 x 50 x 50. Я пытаюсь создать коллекцию (в данном случае словарь) вложенных кубов, которые содержат одинаковую сумму, и подсчитать, сколько вложенных кубов разделяют ту же сумму. Таким образом, по сути, результат будет выглядеть примерно так:

{ключ = сумма, значение = количество кубов с одинаковой суммой}

{256 : 3, 119 : 2, …}

Итак, в этом примере есть 3 куба, сумма которых равна 256, и 2 куба, сумма которых равна 119 и т.д. Вот код, который у меня есть на данный момент, но он только суммирует (по крайней мере, я так думаю):

 an_array = np.array([i for i in range(500)])
cube = np.reshape(an_array, (8, 8, 8))

c_size = 8 # cube size
sum = 0
idx = None

for i in range(cube.shape[0] - cs   2):
     for j in range(cube.shape[1] - cs   2):
          for k in range(cube.shape[2] - cs   2):
          cube_sum = np.sum(cube[i:i   cs, j:j   cs, k:k   cs])
          new_list = {cube_sum : ?}
 

То, что я пытаюсь сделать, это выполнить итерацию куба внутри кубов, суммировать все кубы, а затем подсчитать кубы, которые имеют одинаковую сумму. Любые идеи будут оценены по достоинству.

Комментарии:

1. Вы можете использовать from collections import defaultdict , затем создать dict outside the loops ( result = defaultdict(int) ) , а затем обновить его с помощью result[sum] = 1 . Если ключ не существует в defaultdict , он будет создан и получит значение 0 (из int ).

2. Возможно, вы могли бы уточнить. Итак, я бы вышел из цикла for и dict(result = defaultdict(int))) и увеличил счетчик? Спасибо!

3. Я записал это как ответ, так что у вас есть пример кода.

Ответ №1:

 from collections import defaultdict

an_array = np.array([i for i in range(500)])
cube = np.reshape(an_array, (8, 8, 8))

c_size = 8 # cube size
sum = 0
idx = None
result = defaultdict(int)

for i in range(cube.shape[0] - cs   2):
     for j in range(cube.shape[1] - cs   2):
          for k in range(cube.shape[2] - cs   2):
          cube_sum = np.sum(cube[i:i   cs, j:j   cs, k:k   cs])
          result[cube_sum]  = 1
 

Объяснение

defaultdict(int) , может быть прочитан как result.get(key, 0) . Это означает, что если ключ не существует, он будет инициализирован с 0 . Таким образом, строка result[cube_sum] = 1 будет либо содержать 1, либо добавлять 1 к текущему числу cube_sum .

Комментарии:

1. Ах, я неправильно понял то, что вы сказали изначально. Теперь поймите и спасибо вам! Это сработало просто отлично.