如何计算数组的梯度

时间:2019-06-18 23:33:52

标签: python-3.x numpy statistics regression

我在numpy中有多个数组,我已经绘制了这些数组,我想看看这些图中的哪个总体上是增加还是减少。我知道numpy具有内置的渐变函数,但是可以为每个点提供渐变函数。计算所得梯度数组的均值是否可以让我准确地表示我的图形是减少还是增加?

例如

这些是我的一些数组:

n1=[6.2, 5.0, 6.6, 5.7, 8.3, 8.5, 7.9, 6.7, 8.0, 8.3, 8.6, 8.3]

n2=[13.8, 10.4, 9.4, 12.4, 12.8, 10.9, 11.0, 11.0, 11.7, 14.5, 13.8, 14.2]

目前我正在这样做:

m_n1=np.mean(np.gradient(n1))
m_n2=np.mean(np.gradient(n2))

哪个给:

m_n1为0.1125

m_n2为-0.092

我可以说n1的图是正数,而n2的图是负数吗?

1 个答案:

答案 0 :(得分:0)

采用梯度平均值并不是确定数据趋势的可靠方法。如果用图表表示数据,则有明显的上升趋势,并且指出第二种情况的梯度平均值为负。使用下面的示例,我们可以绘制数据,查看趋势以及梯度的变化性。

您可以看到,使用趋势线是确定数据增加还是减少的更可靠的方法,因为趋势线实际上代表了您的数据。另一方面,梯度会放大子趋势标度的可变性,并且现在包括将在平均值中偏移的正数和负数。

enter image description here

import numpy as np
from matplotlib import peplos as plt

#Define the example data
n1=np.array([6.2, 5.0, 6.6, 5.7, 8.3, 8.5, 7.9, 6.7, 8.0, 8.3, 8.6, 8.3])
n2=np.array([13.8, 10.4, 9.4, 12.4, 12.8, 10.9, 11.0, 11.0, 11.7, 14.5, 13.8, 14.2])

#arbitrary time dimension, assume fixed delta 
tim = np.arange(0,len(n1))

#get linear trend lines
m1, b1 = np.polyfit(tim, n1, 1)
m2, b2 = np.polyfit(tim, n2, 1)


fig=plt.figure(figsize=(12,6))

ax1=plt.subplot(121)
ax1.plot(tim,n1,c='C0',lw=2,label='n1')
ax1.plot(tim,n2,c='C1',lw=2,label='n2')
ax1.plot(tim,m1*tim+b1,ls='dotted',c='C0',lw=2,label='n1 slope=%1.2f'%m1)
ax1.plot(tim,m2*tim+b2,ls='dotted',c='C1',lw=2,label='n2 slope=%1.2f'%m2)
ax1.legend()


ax2=plt.subplot(122)
ax2.plot(tim,np.gradient(n1),c='C0',lw=2,label='n1 gradient mean=%1.2f'%np.mean(np.gradient(n1)))
ax2.plot(tim,np.gradient(n2),c='C1',lw=2,label='n2 gradient mean=%1.2f'%np.mean(np.gradient(n2)))
ax2.axhline(0,c='black')
ax2.legend()

plt.show()