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

时间:2012-03-20 19:40:34

标签: 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

所以基本上我生成一堆从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)))

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

3 个答案:

答案 0 :(得分:23)

使用REPLACE_EVERY_Nth作为步长值的切片:

y[::REPLACE_EVERY_Nth] = REPLACE_WITH

这与您的代码略有不同,因为它将从第一个项目(即索引0)开始。要准确了解代码的作用,请使用

y[REPLACE_EVERY_Nth - 1::REPLACE_EVERY_Nth] = REPLACE_WITH

答案 1 :(得分:3)

您只需在循环中使用范围(开始,结束,步骤)

for index in range(0,len(y),REPLACE_EVERY_Nth):
    y[index] = REPLACE_WITH

答案 2 :(得分:1)

我认为可以在没有任何问题的情况下应用以下解决方案:

for index in xrange(0, len(y), REPLACE_EVERY_Nth):
    y[index] = REPLACE_WITH