如何最有效地替换python中数组的每个第n个值?

mem*_*elf 5 python numpy

我想知道是否有更多的pythonic(和有效)方式执行以下操作:

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
Run Code Online (Sandbox Code Playgroud)

所以基本上我从1到1生成一堆数字MAX_SIZE-1,然后我想用它替换每个REPLACE_EVERY_Nth元素REPLACE_WITH.这工作正常但我想它可以以某种方式完成而不使用enumerate

我在想这样的事情(我知道这是错误的,因为我用y的索引替换原来的y):

y = map(lambda x: REPLACE_WITH if not x%REPLACE_EVERY_Nth else x, range(len(y)))
Run Code Online (Sandbox Code Playgroud)

有没有办法对索引进行模数但是替换值?

Sve*_*ach 23

使用切片REPLACE_EVERY_Nth作为步长值:

y[::REPLACE_EVERY_Nth] = REPLACE_WITH
Run Code Online (Sandbox Code Playgroud)

这与您的代码略有不同,因为它将从第一个项目(即索引0)开始.要准确获取代码的功能,请使用

y[REPLACE_EVERY_Nth - 1::REPLACE_EVERY_Nth] = REPLACE_WITH
Run Code Online (Sandbox Code Playgroud)

  • @Zenon:你可以.试试吧.请收回downvote. (4认同)
  • @Sven Marnach,它适用于numpy数组而不是列表,我真的很抱歉,这真的很酷! (2认同)
  • @Zenon:使用列表,尝试类似:`y [:: REPLACE_EVERY_Nth] = itertools.repeat(REPLACE_WITH,nbr_elements // REPLACE_EVERY_Nth) (2认同)