#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. Ах, я неправильно понял то, что вы сказали изначально. Теперь поймите и спасибо вам! Это сработало просто отлично.