使用Python操作曲线

0 投票
1 回答
613 浏览
提问于 2025-04-18 11:44

我在用一个Python脚本来创建你在图片中看到的曲线。虽然我不打算详细讲这个的实际用途,但我有几个问题:

- 有没有办法在不使用线性值(红色曲线)的情况下,直接创建蓝色和黄色曲线?蓝色曲线的“公式”是 sin(x*90*pi/180)

- 我真的需要像脚本中那样创建一个循环来添加值吗?还是说有更“简洁”的方法可以一行代码就生成这些值的数组?

最后,我只是想确认一下,凭我有限的数学和Python知识,我是不是把事情搞得比需要的更复杂了。谢谢。

curves

### RED CURVE ###

linearValues = []

for i in range(0,91):
    linearValues.append( float(  float(i)/float(90) ) )

linearValues.reverse()



### BLUE CURVE ###

blueCurveValues = []

for i in range(0,91):
    blueCurveValues.append( math.sin(linearValues[i]*90*math.pi/180) )



### YELLOW CURVE ###

yellowCurveValues = []

for i in range(0,91):
    yellowCurveValues.append( float( linearValues[i]-(blueCurveValues[i]-linearValues[i]) ) )    

1 个回答

1

在Python 2中,如果你不想要整数除法,进行除法运算前应该把int类型转换成float类型。只有在你用两个int进行除法时才需要转换,这种情况只会出现在linearValues中(你只需要float(i)/90或者i/float(90),而不是三次转换)。但是在Python 3中(或者使用from __future__ import division),这个转换会自动完成,你就不需要调用float了。我已经把这些调用去掉了。

在Python中创建列表的“优雅”方式叫做“列表推导式”。如果直接翻译你写的内容,应该是:

linearValues = [ i/90 for i in range(90,-1,-1) ]
blueCurveValues = [ math.sin(linearValues[i]*90*math.pi/180) for i in range(91) ]
yellowCurveValues = [ linearValues[i]-(blueCurvevalues[i]-linearValues[i] for i in range(91) ]

如果你不想计算linearValues,最简单的办法就是每次把linearValues[i]替换成i/90。这样可以稍微简化你的蓝色值公式,但对黄色值的简化效果不大。至少,你可以考虑把90*math.pi/180改成math.pi/2(或者把(i/90*90*math.pi/180)改成(i*math.pi/180))。不过这仍然是在使用红色曲线,只是内部处理方式不同。

创建列表的另一个选择是使用map

linearValues = map(lambda x:x/90,range(90,-1,-1))
blueCurveValues = map(lambda x:math.sin(x*90*math.pi/180),linearValues)
yellowCurveValues = map(lambda x,y:x-(y-x),linearValues,blueCurveValues)

使用maplambda通常比列表推导式更难读,但公式更短一般来说更容易理解。所以红色部分可能更适合用列表推导式,而蓝色和黄色则可以根据你的喜好来选择。

撰写回答