python - 将列表内插为四倍长度
问题描述
我需要你的帮助。因此,目标是在列表中的每个元素之间进行插值,以使其长度增加四倍。所以我确实有一个清单,例如:
列表 = [ 1 , 5 , 2 , 6 , 8 ]
我想要的结果是:
new_list = [ 1 ,2 ,3 ,4 , 5 ,4.25 ,3.5 ,2.75, 2 , 3, 4, 5, 6 , 6.5, 7, 7.5 , 8 ,8 ,8 ,8 ]。
我想采用列表中的 5 个元素,在每个元素之间进行插值,因此在原始元素之间再添加 3 个值。因为我无法插入最后一个值,所以我只想再添加三个,在本例中为 8s。
为了更好地理解,我将列表的原始元素标记为粗体。因此,新列表的正常打印元素是每对之间的插值。我希望我能够以一种可以合理理解的方式表达这个问题。
我尝试的代码是以下代码,我也在此处找到:
import sys
EPSILON = sys.float_info.epsilon # smallest possible difference
def print_list(values):
print('[' + ', '.join(format(value, '.3f') for value in values) + ']')
def interpolate(inp, fi):
i = int(fi)
f = fi - i
return (inp[i] if f < EPSILON else
inp[i] + f*(inp[i+1]-inp[i]))
inp = [1, 5, 2, 6, 8]
new_len = 20
delta = (len(inp)-1) / float(new_len-1)
outp = [interpolate(inp, i*delta) for i in range(new_len)]
print_list(inp)
print_list(outp)
结果是:
[1.000, 1.842, 2.684, 3.526, 4.368, 4.842, 4.211, 3.579, 2.947, 2.316, 2.421, 3.263, 4.105, 4.947, 5.789, 6.316, 6.737, 7.158, 7.579, 8.000]
代码的问题是原始元素没有被新列表采用。
解决方案
此函数接受两个参数,一个列表和一个扩展因子,在您的示例中为 4,并返回一个新列表。它不是很优雅,但我相信它可以完成这项工作:
def interpolate(l, expansion_factor):
assert expansion_factor >= 1
new_l = l.copy()
if expansion_factor == 1:
return new_l
length = len(new_l)
i = length - 2
while i >= 0:
next = i + 1
value = new_l[next]
delta = (value - new_l[i]) / expansion_factor
for cnt in range(expansion_factor - 1):
value -= delta
if int(value) == value:
value = int(value)
new_l.insert(next, value)
i -= 1
# last element
value = new_l[-1]
for i in range(expansion_factor - 1):
new_l.append(value)
return new_l
print(interpolate([1, 5, 2, 6, 8], 4))
印刷:
[1, 2, 3, 4, 5, 4.25, 3.5, 2.75, 2, 3, 4, 5, 6, 6.5, 7, 7.5, 8, 8, 8, 8]
推荐阅读
- android - 我想知道为什么我的 FuelManager 类在 android studio 中不被识别
- excel - 如何在 VBA 中保存工作表和 PDF
- python - Django OAuth - 在中间件中包含授权标头?
- typescript - 如果在 Typescript 中满足条件,如何断言联合类型的类型?
- c++ - How are constructors with default parameters called in inheritance hierarchy?
- spring-boot - 调用springboot rest API时的时间差
- locust - 根据响应数据引发异常以将成功的连接标记为失败
- c# - 事件处理程序中的锁定语句 - 可能的死锁?
- c++ - 比较一般树中两个节点的所有子节点
- r - ggplot不显示点