找到我的数据中斜率变化的位置,作为一个可以轻松索引和提取的参数。

20 浏览
0 Comments

找到我的数据中斜率变化的位置,作为一个可以轻松索引和提取的参数。

我有以下数据:\n0.8340502011561366 0.8423491600218922\n0.8513456021654467\n0.8458192388553084\n0.8440111276014195\n0.8489589671423143\n0.8738088120491972\n0.8845129900705279\n0.8988298998926688\n0.924633964692693\n0.9544790734065157\n0.9908034431246875\n1.0236430466543138\n1.061619773027915\n1.1050038249835414\n1.1371449802490126\n1.1921182610371368\n1.2752207659022576\n1.344047620255176\n1.4198117350668353\n1.507943067143741\n1.622137968203745\n1.6814098429502085\n1.7646810054280595\n1.8485457435775694\n1.919591124757554\n1.9843144220593145\n2.030158014640226\n2.018184122476175\n2.0323466012624207\n2.0179200409023874\n2.0316932950853723\n2.013683870089898\n2.03010703506514\n2.0216151623726977\n2.038855467786505\n2.0453923522466093\n2.03759031642753\n2.019424996752278\n2.0441806106428606\n2.0607521369415136\n2.059310067318373\n2.0661157975162485\n2.053216429539864\n2.0715123971225564\n2.0580473413362075\n2.055814512721712\n2.0808278560688964\n2.0601637029377113\n2.0539429365156003\n2.0609648613513754\n2.0585135712612646\n2.087674625814453\n2.062482961966647\n2.066476100210777\n2.0568444178944967\n2.0587903943282266\n2.0506399365756396\n绘制的数据如下:\n\"Plotted\n我想找到斜率变化的点(我用黑色圈出来了,大约在索引26附近):\n\"Point\n我需要找到几百个文件中的这个变化点。到目前为止,我尝试了这个帖子中的建议:\nFinding the point of a slope change as a free parameter- Python\n我认为由于我的数据有些噪音,斜率的变化没有平滑过渡。\n这是我到目前为止尝试的代码:\n

import numpy as np
# 载入1-D数据文件
file = str(sys.argv[1])
y = np.loadtxt(file)
# 根据文件长度创建X
x = np.linspace(1,len(y), num=len(y))
# 计算一阶导数
m = np.diff(y)/np.diff(x)
print(m)
# 计算二阶导数
b = np.diff(m)
print(b)
# 寻找索引
index = 0
for difference in b:
    index += 1
    if difference < 0: 
        print(index, difference)

\n由于我的数据有噪音,所以在我想要的索引之前出现了一些负值。在这种情况下,我想要检索的索引大约是26(即我的数据变为常数的地方)。有没有人有什么建议可以解决这个问题?谢谢!

0
0 Comments

从上面的内容可以整理出以下原因和解决方法:

问题的出现原因:

- 当第一导数改变符号时,斜率的符号就会改变。

- 如果想确定斜率的变化率,就需要使用二阶导数。

- 如果x值是任意赋值的,那么导数就会计算错误。

解决方法:

- 使用numpy库来计算导数。

- 首先计算一阶导数,然后计算二阶导数。

- 找出斜率符号改变的x值。

- 可以使用阈值来确定导数值和项目数量的阈值。

- 可以使用高斯/卷积核对函数进行平滑处理。

- 注意要根据斜率来确定斜率符号改变的x值。

以下是示例代码:

import numpy as np
x = np.linspace(1, 100, 1000)
y = np.cos(x)
# 计算一阶导数
m = np.diff(y)/np.diff(x)
# 计算二阶导数
m2 = np.diff(m)/np.diff(x[:-1])
print(m)
print(m2)
# 获取斜率符号改变的x值
c = len(m)
changes_index = []
for i in range(1, c):
    prev_val = m[i-1]
    val = m[i]
    if prev_val < 0 and val > 0:
        changes_index.append(i)
    elif prev_val > 0 and val < 0:
        changes_index.append(i)
for i in changes_index:
    print(x[i])

注意事项:

- 第一阶导数在开始时为负值(接近5-10),可能需要使用高斯/卷积核对函数进行平滑处理。

- 另一种解决方法是使用阈值来确定导数值和项目数量的阈值。

- 注意使用合适的x值范围来避免出现小数值,可以使用numpy.linspace(1, 100, 100)来生成整数值的x值。

希望以上内容能够解决你的问题。

0
0 Comments

在这个问题中,原始数据是一组数字,我们需要找到斜率变化的位置作为一个可以轻松索引和提取的参数。原始数据由一个名为"data"的字符串表示,其中包含了一系列浮点数,每个数之间用空格分隔。

解决这个问题的方法是,首先将字符串"data"拆分成一个浮点数数组,然后使用numpy库计算数组的差分diff。我们只关心数据降低的部分,所以我们使用np.where函数找到diff中小于0的位置,并将这些位置存储在neg_indeces数组中。接下来,我们计算neg_indeces数组中相邻元素的差分neg_diff,并找到差分最大的位置i_max_dif。最后,通过索引操作,我们找到原始数据中差分最大位置的索引i_max,并输出该索引和对应的值。

使用上述代码运行后,输出结果为26和1.9843144220593145,表示斜率变化最大的位置在索引26处,对应的值为1.9843144220593145。

这段代码的细节部分展示了一些中间结果,如neg_indeces数组中的位置、neg_diff数组中的差分值以及差分最大值的位置i_max_dif。这些中间结果有助于理解代码的执行过程。

最后,作者表示选择了这段代码作为解决方案,因为它能够很好地处理给定的数据。并感谢帮助并进行了点赞。

0