몇 년 전이 질문에 대한 후속 조치 로 numpy에 정식 "이동"기능이 있습니까? 문서 에서 아무것도 볼 수 없습니다 .
내가 찾고있는 간단한 버전은 다음과 같습니다.
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])
이 질문은 어제 빠른 rolling_product 를 작성 하려는 시도에서 나왔습니다 . 누적 제품을 "이동"하는 방법이 필요했고 생각할 수있는 것은에서 논리를 복제하는 것뿐이었습니다 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
np.r_[np.full(n, np.nan), xs[:-n]]
대체 할 수 있는지 궁금합니다.np.r_[[np.nan]*n, xs[:-n]]
np.full