Как векторизовать цикл Python for, который модифицирует каждый элемент кадра данных? - PullRequest
1 голос
/ 23 июня 2019

У меня есть скрипт Python, использующий кадры данных pandas, который заполняет фрейм данных путем преобразования элементов другого фрейма данных. Я мог бы сделать это с помощью простого цикла for или itertuples, но я хотел посмотреть, возможно ли векторизовать его для максимальной скорости (мой фрейм данных очень большой, ~ 60000x12000).

Вот пример того, что я пытаюсь сделать:

    #Sample data
    sample_list=[1,2,5]

У меня есть список значений, как указано выше. Каждый элемент в моей новой матрице - это сумма определенных двух элементов из этого списка, разделенная на постоянное число n.

new_matrix[row,col]=(sample_list[row]+sample_list[col])/n

Таким образом, ожидаемый результат для n = 2 будет:

1   1.5 3
1.5 2   3.5
3   3.5 5

Прямо сейчас я выполняю это с циклом for, перебирая каждый элемент пустой матрицы и устанавливая для них значение, вычисленное по формуле. Есть ли способ векторизации этой операции (то есть что-то вроде new_matrix=2*old_matrix, а не for row, col in range(): new_matrix[row,col]=2*old_matrix[row,col]?

1 Ответ

2 голосов
/ 23 июня 2019

Сначала преобразуйте ваш список в массив:

arr = np.asarray(sample_list)

Затем обратите внимание, что ваше дополнение должно транслироваться для получения 2D-вывода. Чтобы добавить «виртуальное» измерение в массив, используйте np.newaxis:

arr[:,np.newaxis] + arr

Это дает вам:

array([[ 2,  3,  6],
       [ 3,  4,  7],
       [ 6,  7, 10]])

Который тривиально делится на 2 для получения окончательного результата.

Работать наоборот - более эффективно, поскольку деления в 1D, а не в 2D:

arr = np.asarray(sample_list) / 2
arr[:,np.newaxis] + arr
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...