В действительности проблема заключается в том, что я пытаюсь взять список позиций атомов в элементарной ячейке и построить соответствующую суперячейку, учитывая, сколько раз повторять ячейки в каждом направлении.Неожиданное поведение при обновлении 3D-массива
Это приводит к структуре петли:
#Create Every Unit Cell in SuperCell
aNum=2
bNum=2
cNum=2
atomPos = copy.deepcopy(atomPositions)
for l in range(len(atomPos)):
index=0
for i in range(cNum):
for j in range(bNum):
for k in range(aNum):
for _ in range(numEachAtom[l]):
atomPositions[l][index][0] = atomPos[l][index][0] + 1*k
atomPositions[l][index][1] = atomPos[l][index][1] + 1*j
atomPositions[l][index][2] = atomPos[l][index][2] + 1*i
print atomPositions[0][0]
index += 1
Где atomPositions
является 3D-массив таким образом, что: atomPositions[atomtype=l][atom=index][atomposition=0] = [x,y,z]
и оператор печати для диагностических целей.
Проблема в том, что из заявления печати кажется, что atomPositions[0][0]
изменяется чаще, чем тип атома, и, как кажется, индекс обновляется правильно, я просто этого не понимаю.
Почему atomPositions[0][0]
меняется чаще, чем l
?
Первоначально я столкнулся с проблемой изменения списка, который вы повторяете, отсюда и глубокая копия с самого начала. Любые комментарии были бы высоко оценены!
P.S. Это мой первый раз, задавая вопрос, и я полный новичок в Python, поэтому, пожалуйста, не стесняйтесь комментировать мое отсутствие форматирования/ясность/стиль и т.д.
Edit: Пример начала выход для numEachAtom=[4,6]
:
[0.17611251675504244, 0.17611251675504244, 0.17611251675504244]
[0.17611251675504244, 0.17611251675504244, 0.17611251675504244]
[0.17611251675504244, 0.17611251675504244, 0.17611251675504244]
[0.17611251675504244, 0.17611251675504244, 0.17611251675504244]
[1.1761125167550424, 0.17611251675504244, 0.17611251675504244]
[1.1761125167550424, 0.17611251675504244, 0.17611251675504244]
[1.1761125167550424, 0.17611251675504244, 0.17611251675504244]
[1.1761125167550424, 0.17611251675504244, 0.17611251675504244]
[0.17611251675504244, 1.1761125167550424, 0.17611251675504244]
[0.17611251675504244, 1.1761125167550424, 0.17611251675504244]
[0.17611251675504244, 1.1761125167550424, 0.17611251675504244]
т.д.
Edit: Как atomPositions инициализируется:
#Separate out positions of different atom types
atomPositions = []
counter=0
for i,atomN in enumerate(numEachAtom):
atomPositions.append(origAtomPositions[counter:counter+atomN])
counter += atomN
Edit: зависимости и т.д.
import sys
import scipy as sp
from scipy import *
import copy
Edit: atomPositions [0] инициализируется в
[[ 0.17611252 0.17611252 0.17611252]
[ 0.32388748 0.32388748 0.32388748]
[ 0.42611252 0.42611252 0.42611252]
[ 0.07388748 0.07388748 0.07388748]
[ 0.17611252 0.17611252 0.17611252]
[ 0.32388748 0.32388748 0.32388748]
[ 0.42611252 0.42611252 0.42611252]
[ 0.07388748 0.07388748 0.07388748]
[ 0.17611252 0.17611252 0.17611252]
[ 0.32388748 0.32388748 0.32388748]
[ 0.42611252 0.42611252 0.42611252]
[ 0.07388748 0.07388748 0.07388748]
[ 0.17611252 0.17611252 0.17611252]
[ 0.32388748 0.32388748 0.32388748]
[ 0.42611252 0.42611252 0.42611252]
[ 0.07388748 0.07388748 0.07388748]
[ 0.17611252 0.17611252 0.17611252]
[ 0.32388748 0.32388748 0.32388748]
[ 0.42611252 0.42611252 0.42611252]
[ 0.07388748 0.07388748 0.07388748]
[ 0.17611252 0.17611252 0.17611252]
[ 0.32388748 0.32388748 0.32388748]
[ 0.42611252 0.42611252 0.42611252]
[ 0.07388748 0.07388748 0.07388748]
[ 0.17611252 0.17611252 0.17611252]
[ 0.32388748 0.32388748 0.32388748]
[ 0.42611252 0.42611252 0.42611252]
[ 0.07388748 0.07388748 0.07388748]
[ 0.17611252 0.17611252 0.17611252]
[ 0.32388748 0.32388748 0.32388748]
[ 0.42611252 0.42611252 0.42611252]
[ 0.07388748 0.07388748 0.07388748]]
Эй, это очень хороший вопрос! Было бы полезно предоставить краткий пример вывода, чтобы люди могли понять, что ваша проблема в конкретном случае. – Marcin
Как вы инициализируете 'atomPositions'? – sth
Можете ли вы предоставить рабочий пример для содержимого списков? –