Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据x值何时变平来划分阶跃函数数组_Python_Arrays_Numpy_Piecewise - Fatal编程技术网

Python 如何根据x值何时变平来划分阶跃函数数组

Python 如何根据x值何时变平来划分阶跃函数数组,python,arrays,numpy,piecewise,Python,Arrays,Numpy,Piecewise,我遇到了一个在python中很难解决的问题(我现在将其归咎于sever时差) 我有一个数组,我们称它为x。x的绘图,其中y轴是通用值,x轴是数组的索引,如下所示: 我想做的是在初始碰撞后隔离平坦部分(请参见我感兴趣的下一张图片): 我想忽略前面的平面线和凹凸,在第二幅图像中创建一个由五个红色框组成的数组,这样我就有了 x_chunk=[[框0]、[框1]、[框2]、[框3]、[框4]] 我想忽略红色块之间的所有倾斜过渡线。我在确定正确的迭代过程和设置条件以获得所需内容时遇到困难。因此,这可能

我遇到了一个在python中很难解决的问题(我现在将其归咎于sever时差)

我有一个数组,我们称它为x。x的绘图,其中y轴是通用值,x轴是数组的索引,如下所示:

我想做的是在初始碰撞后隔离平坦部分(请参见我感兴趣的下一张图片):

我想忽略前面的平面线和凹凸,在第二幅图像中创建一个由五个红色框组成的数组,这样我就有了

x_chunk=[[框0]、[框1]、[框2]、[框3]、[框4]]


我想忽略红色块之间的所有倾斜过渡线。我在确定正确的迭代过程和设置条件以获得所需内容时遇到困难。

因此,这可能不是最干净的解决方案,但它仍然有效:

import numpy as np
import matplotlib.pyplot as plt

# Create data
r=np.random.random(50)
y1 = np.array([50,40,30,20,10])
y=np.repeat(y1,10)
y[9]=y[9]+10
y=y+r

# Plot data
x=np.arange(len(y))
plt.plot(x,y)
plt.show()
会给你这样的东西:

#找到最大值并从那里开始
idxStart=np.argmax(y)
y2=y[idxStart:]
#抓取跳跃指数

idxs=np.where(np.diff(y2)因此,这可能不是最干净的解决方案,但它可以:

import numpy as np
import matplotlib.pyplot as plt

# Create data
r=np.random.random(50)
y1 = np.array([50,40,30,20,10])
y=np.repeat(y1,10)
y[9]=y[9]+10
y=y+r

# Plot data
x=np.arange(len(y))
plt.plot(x,y)
plt.show()
会给你这样的东西:

#找到最大值并从那里开始
idxStart=np.argmax(y)
y2=y[idxStart:]
#抓取跳跃指数

idxs=np.where(np.diff(y2)没有测试,因为我没有数据,但是类似的东西应该可以工作

def findSteps(arr, thr=.02, window=10, disc=np.std):
    d = disc(np.lib.stride_tricks.as_strided(arr, strides = arr.strides*2, shape = (arr.size-window+1, window)), axis = 1)
    m = np.minimum(np.abs(d[:-window]), np.abs(d[window:])) < thr
    i = np.nonzero(np.diff(m))
    return np.split(arr[window:-window], i)[::2]
def findSteps(arr,thr=.02,window=10,disc=np.std):
d=圆盘(np.lib.stride_.as_跨步(arr,跨步=arr.strides*2,形状=(arr.size-window+1,window)),轴=1)
m=np.minimum(np.abs(d[:-window]),np.abs(d[window:])
可能需要处理窗口和阈值,如果
np.std
不起作用,您可能需要为
disc
编写一个斜率函数,但基本思想是通过
window
步数向前和向后看,看看步幅的标准偏差(或斜率)是否接近0

您将得到
True
值块,您可以通过
np.nonzero(np.diff())


然后,您将
np.按块将数组拆分为数组列表,并仅获取列表中的其他每个成员(因为其他子数组将是转换)。

由于我没有数据,因此未进行测试,但类似的方法应该可以工作

def findSteps(arr, thr=.02, window=10, disc=np.std):
    d = disc(np.lib.stride_tricks.as_strided(arr, strides = arr.strides*2, shape = (arr.size-window+1, window)), axis = 1)
    m = np.minimum(np.abs(d[:-window]), np.abs(d[window:])) < thr
    i = np.nonzero(np.diff(m))
    return np.split(arr[window:-window], i)[::2]
def findSteps(arr,thr=.02,window=10,disc=np.std):
d=圆盘(np.lib.stride_.as_跨步(arr,跨步=arr.strides*2,形状=(arr.size-window+1,window)),轴=1)
m=np.minimum(np.abs(d[:-window]),np.abs(d[window:])
可能需要处理窗口和阈值,如果
np.std
不起作用,您可能需要为
disc
编写一个斜率函数,但基本思想是通过
window
步数向前和向后看,看看步幅的标准偏差(或斜率)是否接近0

您将得到
True
值块,您可以通过
np.nonzero(np.diff())


然后,您将
np.按块将数组拆分为数组列表,并仅获取列表中的每个其他成员(因为其他子数组将是转换).

感谢您的回复!我正在考虑使用np.std和scipy.optimize.curve\u fit的参数来拟合直线并最小化斜率。我不知道slide\u tricks函数,尽管它的文档不是很好,但它似乎是一个拆分数组的巧妙技巧。一个简单的问题:为什么做m=np.minimum(np.abs(d[:-window]),np.abs(d[window:]))窗口
数据点。
abs
是为了防止你用斜率函数替换
np.std
。感谢你的回复!我正在考虑使用np.std和scipy.optimize.curve\u的参数拟合一条直线并最小化斜率。我不知道slide_tricks函数,虽然它的文档不是很好,但它似乎是一个拆分数组的巧妙技巧。一个简单的问题:为什么要使用m=np.minimum(np.abs(d[:-window]),np.abs(d[window:]))窗口
数据点。
abs
用于用斜率函数替换
np.std