【发布时间】:2018-11-15 08:58:13
【问题描述】:
我有一个不是单调递增的数组。我想在数组减小时应用恒定速率使其单调增加。
我在这里创建了一个比率为 0.2 的小示例:
# Rate
rate = 0.2
# Array to interpolate
arr1 = np.array([0,1,2,3,4,4,4,3,2,2.5,3.5,5.2,7,10,9.5,np.nan,np.nan,np.nan,11.2, 11.4, 12,10,9,9.5,10.2,10.5,10.8,12,12.5,15],dtype=float)
# Line with constant rate at first monotonic decrease (index 6)
xx1 = 6
xr1 = np.array(np.arange(0,arr1.shape[0]+1),dtype=float)
yr1 = rate*xr1 + (arr1[xx1]-rate*xx1)
# Line with constant rate at second monotonic decrease [index 14]
xx2 = 13
xr2 = np.array(np.arange(0,arr1.shape[0]+1),dtype=float)
yr2 = rate*xr2 + (arr1[xx2]-rate*xx2)
# Line with constant rate at second monotonic decrease [index 14]
xx3 = 20
xr3 = np.array(np.arange(0,arr1.shape[0]+1),dtype=float)
yr3 = rate*xr3 + (arr1[xx3]-rate*xx3)
plt.figure()
plt.plot(arr1,'.-',label='Original')
plt.plot(xr1,yr1,label='Const Rate line 1')
plt.plot(xr2,yr2,label='Const Rate line 2')
plt.plot(xr3,yr3,label='Const Rate line 2')
plt.legend()
plt.grid()
“原始”数组是我的数据集。 我想要的最终结果是蓝色+红色虚线。在图中,我还突出显示了“恒定速率曲线”。
由于我有非常大的数组(数百万条记录),我想避免整个数组的 for 循环。
非常感谢大家的帮助!
【问题讨论】:
-
将数组的副本移动一个样本,然后从原始样本中减去该样本,以找到一个样本小于下一个样本的位置。
-
您应该将“reshape”更改为“interpolate”,因为“reshaping”与此完全无关。
-
如果 rate = 0.3 会怎样?然后
arr2 = np.array([0, 1, 2, 3, 4, 4, 4, 4.3, 4.6, 4.9, 5.2, 5, ...])。如您所见,它不是单调递增的。所以你需要检查一下......为什么不跳过不需要的点并将连续增加的点用一条线连接起来,例如arr1[6] = 4和arr1[11] = 5,arr1[13] = 10和arr1[18] = 11.2? -
@AndyK 我按照你的建议连接这些点,但我需要找到一个连接点位于从第一个点开始的直线上方并且以恒定速率(我将问题更新为更清楚)。
-
当
x[26] = x[20]和x[27] > x[20]时,为什么您的预期输出会在x[20]和x[29]之间进行插值?你期待x[n] > x[n-1] + 0.2吗?
标签: python arrays numpy reshape rate