我有一个数据集,我用它来绘制散点图,我已将这些数据分成两个单独的列表,"时间"和"身高"。 "时间"中的每个指数; list对应于" height"中的相同索引。名单。问题是偶尔用于测量数据的仪器发生故障,因此某些高度值读为零。所以我需要删除高度读数为零的时间和高度列表中的每个索引。 以下是我正在使用的代码部分:
Traceback (most recent call last):
File "NewData.py", line 38, in <module>
if height[i]=0:
IndexError: list index out of range
这背后的想法是高度列表的所有值将被搜索为等于零的值然后它们将被删除,并且时间列表中的相应索引也将被删除,并且一切都会很酷豆子。 但是,我收到了这个错误:
{{1}}
任何人都可以解释如何解决这个问题,或者只是如何编写新代码来实现同样的目标?
答案 0 :(得分:3)
在迭代时,您必须不修改列表。这会产生副作用,因为循环不知道发生了删除。
这是一种更好的方法,使用列表理解:
time = [x for i, x in enumerate(time) if height[i]]
height = [x for x in height if x]
通过仅保留您不希望删除的元素,使用列表推导创建新列表。
答案 1 :(得分:0)
我喜欢在中使用 np.delete(),而循环则是这样:
i=0
limit=np.size(time)
while(i<limit):
if height[i]==0:
time=np.delete(time,i)
height=np.delete(height,i)
limit-=1
else:
i+=1
请注意,如果高度为0,则计数器不会递增,您可以确保不对新数组维度进行索引。
答案 2 :(得分:0)
与大多数语言一样,在迭代时从列表中删除内容并不是一个好主意。原因是每次循环都不会检查i
的结束点。例如,如果np.size(time)==10
,则在第一个删除的元素之后,time
的新长度将为9
,但i
仍将继续增加到9
},导致您尝试访问不再存在的元素time[9]
。
幸运的是,Python有很多方法可以解决这个问题,这些方法不会对您列出的示例产生重大影响。你可以倒退:
for i in reversed(range(len(time))):
if height[i] == 0:
del time[i]
del height[i]
这是有效的,因为删除元素i
不会影响元素0:i-1
。但是,您可能不应该这样做,因为它非常低效(特别是对于大型列表)。
您还可以构建一个元素列表,以便继续使用列表推导:
keep = [i for i,h in enumerate(height) if h != 0]
time = [time[i] for i in keep]
height = [height[i] for i in keep]
这可能是更多的“Pythonic”方式,无论价值多少。
鉴于你已经在使用numpy,你可能想使用numpy为你选择合适的元素:
import numpy as np
time = np.array(time)
height = np.array(height)
time = time[height != 0]
height = height[height != 0]
答案 3 :(得分:-1)
为什么不忽略高度为零的那些。不涉及删除,创建新列表或复制元素。因此,当您绘制散点图时,只有在高度大于零时才更新绘图。