【问题标题】:how to replace every n-th value of an array in python most efficiently?如何最有效地替换python中数组的每个第n个值?
【发布时间】:2012-03-21 03:51:43
【问题描述】:

我想知道是否有更 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_WITH 替换每个REPLACE_EVERY_Nth 元素。这工作正常,但我想它可以不使用enumerate 以某种方式完成?

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

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

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

【问题讨论】:

  • 你不能从 1 开始,然后按 100(或 N)计数吗?

标签: python numpy


【解决方案1】:

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

y[::REPLACE_EVERY_Nth] = REPLACE_WITH

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

y[REPLACE_EVERY_Nth - 1::REPLACE_EVERY_Nth] = REPLACE_WITH

【讨论】:

  • @Zenon:你可以。试试看。请收回反对票。
  • @Zenon:您使用的是列表,而不是 NumPy 数组。即使对于一个列表,这样的分配也是可能的,但是你需要分配一个可迭代的。
  • @Sven Marnach,它适用于 numpy 数组但不适用于列表,我真的很抱歉,这真的很酷!
  • @memyself:我介绍了如何使用偏移量。
  • @Zenon:使用列表,尝试类似:y[::REPLACE_EVERY_Nth] = itertools.repeat(REPLACE_WITH, nbr_elements//REPLACE_EVERY_Nth)
【解决方案2】:

您可以简单地将 range(start, end, step) 用于您的循环:

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

【讨论】:

    【解决方案3】:

    我认为可以应用以下解决方案而不会出现任何问题:

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

    【讨论】:

      猜你喜欢
      • 2018-01-20
      • 1970-01-01
      • 2018-01-30
      • 1970-01-01
      • 1970-01-01
      • 2018-11-15
      • 1970-01-01
      • 2020-10-22
      • 1970-01-01
      相关资源
      最近更新 更多