Как создать цикл for для добавления значения к каждому элементу массива в Python

#python #arrays #numpy

#питон #массивы #тупой

Вопрос:

У меня есть массив следующим образом:

 xyz = [[ 0.08778,  0.99666,  0.30648],
       [ 0.41688,  2.70076,  1.10135],
       [ 1.90494,  0.91685, -0.26984],
       [-0.44512,  1.73972, -1.24406],
       [-1.68572,  1.01617,  1.01221],
       [-0.1977 , -0.77177, -0.35553],
       [ 0.61588,  3.6995 ,  1.59813],
       [ 2.98863,  0.86173, -0.59616],
       [-0.78312,  2.20935, -2.22362],
       [-2.73208,  1.02071,  1.44702],
       [-0.36006, -1.82939, -0.72827]]
 

Я хочу добавить 0,005 к первому элементу (0,08778), а затем сохранить этот массив в новый файл ‘output0.xyz’. Затем я хочу добавить 0,005 ко второму элементу (0,99666) и сохранить первый элемент в качестве его исходного значения, а также сохранить этот массив в новый файл ‘output1.xyz’ и так далее. Итак, мне нужно написать 33 новых файла, в каждом из которых изменено только одно из чисел в xyz.
Вот мой код:

 i = 30
number_atoms = 12
at_nums = [26.,  6.,  6.,  6.,  6.,  6.,  8.,  8.,  8.,  8.,  8.])

for atom in xyz:
    for coordinate in atom:
        coordinate  = 0.005
       
        with open('output{}.xyz'.format(i), 'w') as f:
            f.write('{:.0f}nn'.format(number_atoms))
            for at_num_i, xyz_disp_i in zip(at_nums, xyz):
                f.write('{:.0f}t{:.8f}t{:.8f}t{:.8f}n'.format(at_num_i, *xyz_disp_i))
 

В настоящее время этот код просто сохраняет исходный массив в файл с именем ‘output30.xyz’. Я уже давно в тупике по этому поводу!

Ответ №1:

Вам нужно копировать xyz каждую итерацию и изменять значения в копии, чтобы отслеживать исходные значения:

 number_atoms = 12
at_nums = [26., 6., 6., 6., 6., 6., 8., 8., 8., 8., 8.]

xyz = [
    [0.08778, 0.99666, 0.30648], [0.41688, 2.70076, 1.10135],
    [1.90494, 0.91685, -0.26984], [-0.44512, 1.73972, -1.24406],
    [-1.68572, 1.01617, 1.01221], [-0.1977, -0.77177, -0.35553],
    [0.61588, 3.6995, 1.59813], [2.98863, 0.86173, -0.59616],
    [-0.78312, 2.20935, -2.22362], [-2.73208, 1.02071, 1.44702],
    [-0.36006, -1.82939, -0.72827]
]

for i, atom in enumerate(xyz):
    for j, item in enumerate(atom):
        new_xyz = [row.copy() for row in xyz]
        new_xyz[i][j]  = .005

        with open('/tmp/output{}.xyz'.format(i * 3   j), 'w') as f:
            f.write('{:.0f}nn'.format(number_atoms))
            for at_num_i, xyz_disp_i in zip(at_nums, new_xyz):
                f.write(
                    '{:.0f}t{:.8f}t{:.8f}t{:.8f}n'.format(
                        at_num_i, *xyz_disp_i
                    )
                )
 

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

1. Таким образом, это добавляет 0,005 ко всем трем элементам [0,08778, 0,99666, 0,30648], а затем ко всем трем [0,41688, 2,70076, 1,10135] и т. Д.. И создает 11 новых выходных файлов. Мне нужно, чтобы он добавлялся к каждому числу по отдельности, так что у меня будет 33 выходных файла, по одному файлу на каждое число с добавлением 0,005.

2. @Dragmoogle: Но в нем всего 11 элементов xyz , не могли бы вы пояснить это в вопросе?

3. Итак, в xyz есть 11 элементов. Но в каждом элементе есть 3 элемента. Итак, мне нужно, чтобы он создал 33 новых выходных файла

4. Я больше не знаю, как прояснить этот вопрос! В моем первом выходном файле должно быть 0.08778 0.005, а все остальные числа должны быть одинаковыми. Мой 33-й выходной файл должен иметь -0.72827 0.005 со всеми остальными одинаковыми числами.

5. Ах, вы правы. Я не заметил, что вы изменили свой первоначальный ответ, приношу извинения за это и большое вам спасибо за вашу помощь. Я приму ваш ответ сейчас.