Как заменить каждое n-ое значение массива в Python наиболее эффективно? - PullRequest
5 голосов
/ 20 марта 2012

Мне было интересно, есть ли более питонический (и эффективный) способ сделать следующее:

MAX_SIZE = 100
nbr_elements = 10000
y = np.random.randint(1, MAX_SIZE, nbr_elements)


REPLACE_EVERY_Nth = 100
REPLACE_WITH = 120
c = 0

for index, item in enumerate(y):
    c += 1
    if (c % REPLACE_EVERY_Nth == 0):
        y[index] = REPLACE_WITH

Таким образом, в основном я генерирую группу чисел от 1 до MAX_SIZE-1, а затем хочу заменить каждый элемент REPLACE_EVERY_Nth на REPLACE_WITH. Это прекрасно работает, но я думаю, что это может быть как-то сделано без использования enumerate?

Я думал, что-то вроде этого (что я знаю, неправильно, потому что я заменяю оригинал у с индексами у):

y = map(lambda x: REPLACE_WITH if not x%REPLACE_EVERY_Nth else x, range(len(y)))

есть ли способ сделать по модулю индексы, но заменить значения?

Ответы [ 3 ]

23 голосов
/ 20 марта 2012

Используйте нарезку с REPLACE_EVERY_Nth в качестве значения шага:

y[::REPLACE_EVERY_Nth] = REPLACE_WITH

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

y[REPLACE_EVERY_Nth - 1::REPLACE_EVERY_Nth] = REPLACE_WITH
3 голосов
/ 20 марта 2012

Вы можете просто использовать диапазон (начало, конец, шаг) для вашего цикла:

for index in range(0,len(y),REPLACE_EVERY_Nth):
    y[index] = REPLACE_WITH
1 голос
/ 20 марта 2012

Я думаю, что следующее решение может быть применено без каких-либо проблем:

for index in xrange(0, len(y), REPLACE_EVERY_Nth):
    y[index] = REPLACE_WITH
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...