pythonic方法用超出邻居值的限制替换数组中的值

时间:2014-07-17 01:15:35

标签: python arrays numpy

我将数组中的值替换为限制值,如下所示:

ys[ys > zmax] = zmin

但是现在不是用zmin替换大于zmax的值,而是想用它们之前的数组中的邻居值替换它们:如果ys [30]是> zmax,我想分配以前的值:

ys[30] = ys[29]

但是由于pythonic方式并不处理像索引这样的简单事情,所以我不知道如何做到这一点。任何人吗?

3 个答案:

答案 0 :(得分:3)

认为这就是你要求的:

>>> l = [5, 10, 25, 33, 6, 8, 19]
>>> zmax = 15
>>> [l[idx-1] if (ent > zmax) and (idx > 0) else ent for idx, ent in enumerate(l)]
[5, 10, 10, 25, 6, 8, 8]

我们只使用enumerate获取list中每个项目的索引和值,如果值大于zmax,请将其替换为l[index-1] ,否则我们只取原值。我不确定您希望处理l[0] > zmax的情况,所以我现在根本不替换它。

这里的逻辑与正常的循环相同,只是为了澄清:

new_l = [] 对于idx,ent in enumerate(l):    if(ent> zmax)和(idx> 0):       cnt = idx -1       而l [cnt]> ZMAX:           cnt - = 1       new_l.append(升[CNT])    其他:       new_l.append(ENT)

修改

这是一种尝试确保新列表中的值高于zmax的简单方法,方法是尝试与最近的较小索引交换包含小于zmax的值的列表。同样,如果没有较低的索引的值小于zmax,我们什么都不做。

new_l = []
for idx, ent in enumerate(l):
   if (ent > zmax) and (idx > 0):
      cnt = idx - 1
      while l[cnt] > zmax and cnt > 0:
          cnt -= 1
      new_val = l[cnt] if l[cnt] <= zmax else l[idx] # If we didn't find a good index to swap with, keep the original
      new_l.append(new_val)
   else:
      new_l.append(ent)

答案 1 :(得分:2)

好的,这个怎么样:

>>> ys = np.array([10,15,20,30,14,20,30,15,20])
>>> zmax = 15
>>> ys
array([10, 15, 20, 30, 14, 20, 30, 15, 20])
>>> ys[np.maximum.accumulate(np.arange(len(ys)) * (ys <= zmax))]
array([10, 15, 15, 15, 14, 14, 14, 15, 15])

这通过获取我们通常使用的指数产生前向填充:

>>> np.arange(len(ys))
array([0, 1, 2, 3, 4, 5, 6, 7, 8])

找到我们想要保留的内容:

>>> ys <= zmax
array([ True,  True, False, False,  True, False, False,  True, False], dtype=bool)

将我们 想要保留的指数归零:

>>> np.arange(len(ys)) * (ys <= zmax)
array([0, 1, 0, 0, 4, 0, 0, 7, 0])

然后取累积最大值:

>>> np.maximum.accumulate(np.arange(len(ys)) * (ys <= zmax))
array([0, 1, 1, 1, 4, 4, 4, 7, 7])

答案 2 :(得分:2)

这里是纯python,假设你的第一个索引小于最大值。如果你不想使用numpy - 虽然numpy可能非常快

ys = [int(uniform(1, 10)) for i in range(20)]
print ys, "before"

maxVal = 5 #set max
for i in range(1, len(ys)):
    if ys[i] > maxVal:
        ys[i] = ys[i-1]

print ys, "after"

<强>输出

[3, 8, 9, 8, 9, 8, 7, 3, 4, 9, 1, 4, 4, 2, 2, 1, 4, 5, 3, 6] before
[3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 1, 4, 4, 2, 2, 1, 4, 5, 3, 3] after