вложенные l oop и newaxis numpy - PullRequest
0 голосов
/ 18 апреля 2020

Допустим, у меня есть пустой список с пометкой Энергии, и я заполнил бы этот список, перебрав некоторые другие переменные, как показано ниже,

r=read('atoms_positions.txt')
e=read('previous_calculations.txt')
Energies=np.zeros([len(e), len(r)])
spd=3
for a in range(len(r)):
    for b in range(spd):
        Energies[:,a]+=dos_site(a,spd)

Мой первый вопрос: Как работают 'Энергии [: будет выглядеть? Я имею в виду, как будет выполняться l oop? Какова форма и размер энергий после выполнения кода.

Мой второй вопрос касается функции newaxis numpy, допустим, у меня есть массив 1_D, подобный этой «плотности», и затем я хочу выполнить следующая операция:

density=np.array([list of random numbers])

gauss=np.array([list of random numbers])

density+=density[:,np.newaxis]*gauss

Опять я не могу понять вывод моего массива после выполнения вышеуказанного куска кода ??? '' 'Обратите внимание, что dos_site - это функция, которая возвращает массив 1_D.

1 Ответ

0 голосов
/ 18 апреля 2020
Energies[:,a]+=dos_site(a,spd)

Это добавляет (затем назначает) массив с одним d (возвращаемый dos_site) к столбцу a'th

>>> a = np.zeros([5, 6])
>>> a[:,0] += np.arange(5)
>>> a
array([[0., 0., 0., 0., 0., 0.],
       [1., 0., 0., 0., 0., 0.],
       [2., 0., 0., 0., 0., 0.],
       [3., 0., 0., 0., 0., 0.],
       [4., 0., 0., 0., 0., 0.]])
>>> a[:,0] += np.arange(5)
>>> a
array([[0., 0., 0., 0., 0., 0.],
       [2., 0., 0., 0., 0., 0.],
       [4., 0., 0., 0., 0., 0.],
       [6., 0., 0., 0., 0., 0.],
       [8., 0., 0., 0., 0., 0.]])
>>> a[:,1] += np.arange(5)
>>> a
array([[0., 0., 0., 0., 0., 0.],
       [2., 1., 0., 0., 0., 0.],
       [4., 2., 0., 0., 0., 0.],
       [6., 3., 0., 0., 0., 0.],
       [8., 4., 0., 0., 0., 0.]])

Использование np.newaxis разрешает широковещание .

>>> x = np.array([1,2,3,4])
>>> y = np.array([3,1,6,2])

>>> x[:,np.newaxis]*y
array([[ 3,  1,  6,  2],
       [ 6,  2, 12,  4],
       [ 9,  3, 18,  6],
       [12,  4, 24,  8]])

В этом примере np.newaxis добавляет другое измерение, в результате чего получается форма (4,1)

>>> x
array([1, 2, 3, 4])
>>> x[:,np.newaxis]
array([[1],
       [2],
       [3],
       [4]])

Массив y умножается на каждый элемент в x, создавая двумерный массив.

[[1 * y],
 [2 * y],
 [3 * y],
 [4 * y]]

Вещание массива в Numpy

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...