Tiếp theo câu hỏi này nhiều năm trước, có một chức năng "thay đổi" kinh điển trong numpy không? Tôi không thấy bất cứ điều gì từ tài liệu .
Đây là một phiên bản đơn giản của những gì tôi đang tìm kiếm:
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)]
Sử dụng cái này giống như:
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])
Câu hỏi này đến từ nỗ lực của tôi để viết một sản phẩm Roll_product nhanh ngày hôm qua. Tôi cần một cách để "thay đổi" một sản phẩm tích lũy và tất cả những gì tôi có thể nghĩ là tái tạo logic trong đó np.roll()
.
Vì vậy, np.concatenate()
là nhanh hơn nhiều so với np.r_[]
. Phiên bản này của hàm hoạt động tốt hơn rất nhiều:
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)))
Một phiên bản thậm chí còn nhanh hơn chỉ cần phân bổ trước mảng:
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]]
có thể được thay thế bằngnp.r_[[np.nan]*n, xs[:-n]]
tương tự cho điều kiện khác, mà không cầnnp.full