我正在尝试从.txt文件(Aperture,ShutterSpeed)中提取数据,然后使用我已经创建的函数应用一些计算,并以某种方式绘制结果。
在Python中使用它的最佳方法是什么?
我已经阅读了数据:
#!/usr/bin/python
import math
filename='/home/stagiaire/Bureau/derr.txt'
with open(filename) as f:
data = f.read()
data = data.split('\n')
Fnumber = [row.split(' ')[0] for row in data]
ShutterSpeed = [row.split(' ')[1] for row in data]
但我的函数不接受计算Lux值,
def Calcul_Lux(Fnumber,ShutterSpeed):
x=math.pow(Fnumber,2)/(ShutterSpeed)
IL=math.log(x,2)
lux = math.pow(2,IL) * 2.5
return lux
我的想法是将我的数据列为一个列表(两列Fnumber和ShutterSpeed),但我不知道该怎么做。
答案 0 :(得分:4)
读取数据时,它将被读取为字符串,这意味着您在Fnumber和ShutterSpeed中获得的值也是字符串类型。由于Calcul_Lux函数需要数字,因此需要将字符串值拼写为数字。
要将字符串类型转换为浮点数,可以使用float(<object>)
,如果您希望使用整数,则可以使用int(<object>)
要解决您的问题,您可以像这样更改Fnumber
和ShutterSpeed
的分配:
Fnumber = [float(row.split(' ')[0]) for row in data]
ShutterSpeed = [float(row.split(' ')[1]) for row in data]
要为每个值调用函数并将其作为列表返回,我们首先需要将Fnumber和ShutterSpeed打包到单个元组列表中。我们可以使用zip()
函数执行此操作:
tuples = zip(Fnumber, ShutterSpeed)
接下来,我们可以使用Calcul_Lux
函数为列表中的每个项调用函数map()
,该函数基本上对列表中的每个项执行给定的lambda函数:
output = map(lambda tup: Calcul_Lux(tup[0], tup[1]), tuples)
这会将您的所有值作为列表返回。
要绘制输出并将它们与常量线进行比较,我们可以使用matplotlib
库。我们可以使用它的plot()
函数将输出绘制为点,我们可以使用axhline()
函数绘制比较线。最后,绘图的代码看起来像这样。
import matplotlib.pyplot as plt # To import the matplotlib library
plt.plot(range(len(output)), output, 'ro') # To draw the points from the output
plt.axhline(y=48000) # To draw the 48.000 comparison line
plt.show() # To show the plot
引起ValueError: ordinal must be >= 1
是因为我们只提供了y值,没有任何x值。要根据索引绘制输出,我们可以将plt.plot(output, 'ro')
更改为包含x值,如下所示:
plt.plot(range(len(output)), output, 'ro')
答案 1 :(得分:1)
with open(filename) as f:
pairs = ((float(x) for x in line.split()) for line in f)
luxes = [Calcul_Lux(fnum, speed) for fnum, speed in pairs]
这是我将如何做到的。 pairs
是一个生成器,为每一行生成一个浮点数生成器。列表推导接受该生成器,拉出这两个值并将它们传递给Calcul_Lux
答案 2 :(得分:0)
您的Calcul_Lux功能期望传递两个值(f-number和shutterspeed),但您的值在两个列表中。您可以将列表压缩在一起,如下所示:
>>> one = [1,2,3]
>>> two = ['a', 'b', 'c']
>>> zip(one, two)
[(1, 'a'), (2, 'b'), (3, 'c')]
然后将值一次传递给您的函数,所以:
for fn, ss in zip(Fnumber, ShutterSpeed):
Calcul_Lux(fn,ss)
答案 3 :(得分:0)
最好像这样提取数据:
import math
def Calcul_Lux(Fnumber,ShutterSpeed):
x=math.pow(Fnumber,2)/(ShutterSpeed)
IL=math.log(x,2)
lux = math.pow(2,IL) * 2.5
return lux
filename='/home/stagiaire/Bureau/derr.txt'
with open(filename) as f:
data = f.read()
data = data.split('\n')
cameraData = [(float(row.split(' ')[0]),float(row.split(' ')[1])) for row in data]
luxes=[Calcul_Lux(Fnumber,ShutterSpeed) for Fnumber,ShutterSpeed in cameraData]