Увеличение списка питонов на величину mod x_i, где x_i зависит от позиции - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть два списка одинаковой длины.Я увеличиваю list1 на величину, но каждая запись должна быть изменена соответствующей записью в list2.

Что я делаю:

for ii in range(len(list1)):
    list1[ii] = (list1[ii]+val) % list2[ii]

Есть ли лучший способ (возможно,используя NumPy)?Я не мог найти ни одного.Эти списки очень длинные, поэтому проблема в производительности.

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Это возможно при использовании numpy

import numpy as np
numpy_list1 = np.array(list1)
numpy_list2 = np.array(list2)

mod_values1 = np.mod(numpy_list1 + val, numpy_list2) 
mod_values2 = np.remainder(numpy_list1 + val, numpy_list2)
mod_values3 = (numpy_list1 + val) % numpy_list2

Все три дают одинаковые результаты.Документация для первый и второй находится здесь.Третий метод был предложен Shadow Ranger в комментариях.

0 голосов
/ 10 февраля 2019

Вы можете использовать enumerate и zip, чтобы уменьшить количество используемых индексаций:

for ii, (a, b) in enumerate(zip(list1, list2)):
    list1[ii] = (a + val) % b

Тем не менее, вы, вероятно, лучшеотключите просто использование списка, чтобы полностью исключить необходимость в индексе, поэтому вы можете удалить enumerate и использовать только zip, что обеспечивает более чистый код (и более быстрый код для загрузки):

# Creates a new list and rebinds list1 to it:
list1 = [(a + val) % b for a, b in zip(list1, list2)]

# Or if list1 *must* be modified in place, slice assignment can do that:
list1[:] = [(a + val) % b for a, b in zip(list1, list2)]

Обратите внимание, что в обоих примерах я переименовал ваш list в list1, потому что затенение имен в конструкторе list является ужасной идеей.

...