5

我有一个 Python 程序,它显示了温度与时间的下降曲线。在下降过程中,温度在一段时间内保持恒定,几乎为 0 斜率,然后继续下降。它是温度恒定时曲线中的这个区域,我希望程序自动检测并显示 y 值。这个值稍后将被放入一个等式中。我试图找出如何做到这一点。我尝试过但失败了,我最后一次尝试是:

import numpy as np
import matplotlib.pyplot as plt
list_of_files=[('logfile.txt', 'temp')]
datalist = [ ( np.loadtxt(filename), label ) for filename, label in list_of_files]
for data, label in datalist:
    plt.plot( data[:0], data[:,1], label=label )
    plt.ginput(n=1, timeout=30, show_clicks=True, mouse_add=1, mouse_pops=3, mouse_stop=2)
    plt.show()

我希望在高原上单击鼠标会显示并保存 y 坐标,只是为了引导我在编程方面朝着正确的方向前进。但是当我点击情节时,这一切只是一个简短的红色标记。我不想点击鼠标......谢谢,Rico。

4

2 回答 2

3

迭代小块数据,确定块的斜率,返回满足您条件的点

def zero_slope(data, chunksize = 3, max_slope = .001):
    """return the 'first' data point with zero slope

    data --> numpy ndarray - 2d [[x0,y0],[x1,y1],...]
    chunksize --> odd int
    returns numpy ndarray
    """
    midindex = chunksize / 2
    for index in xrange(len(data) - chunksize):
        chunk = data[index : index + chunksize, :]
        # subtract the endpoints of the chunk
        # if not sufficient, maybe use a linear fit
        dx, dy = abs(chunk[0] - chunk[-1])
        print dy, dx, dy / dx
        if 0 <= dy / dx < max_slope:
            return chunk[midindex]
于 2013-09-27T14:02:10.490 回答
0

我会通过改进二战的回答来回答。

def zero_slope(data, chunksize =4, max_slope = .04):
    midindex = chunksize / 2
    is_plateau = np.zeros((data.shape[0]))
    for index in range(midindex, len(data) - midindex):
        chunk = data[index - midindex : index + midindex]
        # subtract the endpoints of the chunk
        # if not sufficient, maybe use a linear fit
        dy_dx = abs(chunk[0] - chunk[-1])/chunksize
        print(dy, dx, dy / dx)
        if (0 <= dy / dx < max_slope):
            is_plateau[index] = 1.0
    return is_plateau

is_plateau 返回一个系列,其中 1 代表高原,0 代表没有高原。我玩过许多 max_slope 值,0.04 的值似乎最合适。

于 2019-02-20T08:51:12.583 回答