我有一个2016年的长度列表,但只有242包含数据,其余的设置为无.我的目标是在值之间插值以用IDW(反距离加权)的简单形式填充所有间隙.所以我的脚本的任务是:
迭代myList的所有项目
如果myList包含一个值(不是 None),只需复制它即可
如果在myList中找到"无",则通过计算myList中所有项目的距离来获取左右邻居的位置/值
计算两个邻居间隙的内插值(它们离开的距离越远,它们的重量就越小)
假设我们只有一个较小的列表,只有14个项目(5个有效项目):
myList = [26, None, None, None, 31, None, None, 58, None, 42, None, None, None, 79] resultList = [None] * len(myList) for i in range(len(myList): if not myList[i] is None: resultList[i] = myList[i] else: distance = [i - j for j in range(len(myList)) if not myList[j] is None] neighbors = min([n for n in dist if n>0]), max([n for n in dist if n<0]) # rest of the interpolation (not important for my question): neighbors_c = [(1/float(n))**2 for n in neighbors] c_sum = sum(neighbors_c) neighbors_c = [n/c_sum for n in neighbors_c] resultList = myList[i-neighbors[0]]*neighbors_c[0] + myList[i-neighbors[1]]*neighbors_c[1]
我正在为许多数据集做这件事.我发现这种方法每个数据集大约需要0.59秒.困扰我的是我的列表全部排序,但我只需要2个值.所以99%的距离都是无差别计算的.这导致我尝试两个:在ij变为负数后停止迭代,因为那时显然它遇到了最接近的值:
而不是列表理解:
distance = [i - j for j in range(len(myList)) if not myList[j] is None]
我做了一个正确的for循环,我在距离为零后退出并因此再次变大:
dist = [] for j in range(len(myList)): if not myList[j] is None: dist.append(i-j) if i-j < 0: break
通过这种方法,我可以将每个数据集降低到0.38秒.迭代myList中的所有项目时,第二种方法在开始时很快(项目在第2,第3,第4,......循环之后被点击并立即退出),但最后项目没有任何改进,因为迭代始终开始在j = 0.
我想知道你是否能想出更快的方法来找到数据集中特定数字的两个邻居,而不必检查所有距离,只取最大负数和小正数.
另外,我对python很新,所以如果你在我的脚本中找到其他非pythonic表达式,请告诉我.非常感谢你们!