这个问题在底部有自己的答案。使用预先分配的数组。
跟踪 这个问题年前,有没有一个规范的“移位”函数在麻木? 我没有看到任何东西从 文件。
下面是我要找的东西的一个简单版本:
def shift(xs, n):
if n >= 0:
return np.r_[np.full(n, np.nan), xs[:-n]]
else:
return np.r_[xs[-n:], np.full(-n, np.nan)]
使用这个就像:
In [76]: xs
Out[76]: array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
In [77]: shift(xs, 3)
Out[77]: array([ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.])
In [78]: shift(xs, -3)
Out[78]: array([ 3., 4., 5., 6., 7., 8., 9., nan, nan, nan])
这个问题来自我昨天尝试 写一个快速滚动的产品。我需要一种“转移”累积产品的方法,我所能想到的就是在 np.roll()
中复制逻辑。
因此,np.concatenate()
比 np.r_[]
快得多。这个版本的函数性能要好得多:
def shift(xs, n):
if n >= 0:
return np.concatenate((np.full(n, np.nan), xs[:-n]))
else:
return np.concatenate((xs[-n:], np.full(-n, np.nan)))
更快的版本只是简单地预分配数组:
def shift(xs, n):
e = np.empty_like(xs)
if n >= 0:
e[:n] = np.nan
e[n:] = xs[:-n]
else:
e[n:] = np.nan
e[:n] = xs[-n:]
return e
上面的建议就是答案。使用预分配的数组。