这是Python代码
t0 = df['Temperature'].iloc[0] # Dataframe df with column 'Temperature' is already given
df['DriftedTemp'] = None
for i in range(1,len(df)):
if(np.abs(df['Temperature'].iloc[i] - t0) > toffset): # toffset is a parameter that is given
df['DriftedTemp'].iloc[i] = df['Temperature'].iloc[i]
t0 = df['Temperature'].iloc[i]
它会计算出温度从之前记录的值漂移超过“toffset”时的行,并用这个新值更新该行的“DriftedTemp”列,并将“t0”更新为某个位置的“温度”发生漂移的点。
此类代码的问题在于,当前值取决于在前一行中求值时的前一个值。矢量化将每一列视为矢量,因此前一行的更改状态不会通过简单的矢量化反映出来。
这可以使用 while 循环和矢量化来实现,但我无法想到没有任何循环的简单矢量化技术来完成相同的任务。
矢量化可能是不可能的,因为漂移的计算取决于之前的漂移状态,据说这是使用
numba
的一个很好的用例,基本上创建一个带有逻辑的函数,然后用numba对其进行编译以实现类似C的速度.
import numba
@numba.njit
def drift(temperatures, toffset):
drift = np.full_like(temperatures, fill_value=np.nan, dtype='float')
for i, t in enumerate(temperatures):
if i == 0:
t0 = t
elif abs(t - t0) > toffset:
t0 = drift[i] = t
return drift
df['DriftedTemp'] = drift(df['Temperature'].to_numpy(), 2)