我想知道是否有更多的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)))
有没有办法对索引进行模数但是替换值?
答案 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