使用.txt中的数据,然后使用函数应用计算,然后绘制结果

时间:2017-04-11 14:53:41

标签: python

我正在尝试从.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),但我不知道该怎么做。

4 个答案:

答案 0 :(得分:4)

从字符串输入到float

读取数据时,它将被读取为字符串,这意味着您在Fnumber和ShutterSpeed中获得的值也是字符串类型。由于Calcul_Lux函数需要数字,因此需要将字符串值拼写为数字。

要将字符串类型转换为浮点数,可以使用float(<object>),如果您希望使用整数,则可以使用int(<object>)

要解决您的问题,您可以像这样更改FnumberShutterSpeed的分配:

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]