我将数组中的值替换为限制值,如下所示:
ys[ys > zmax] = zmin
但是现在不是用zmin替换大于zmax的值,而是想用它们之前的数组中的邻居值替换它们:如果ys [30]是> zmax,我想分配以前的值:
ys[30] = ys[29]
但是由于pythonic方式并不处理像索引这样的简单事情,所以我不知道如何做到这一点。任何人吗?
答案 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