बाद-अप से इस सवाल का साल पहले, वहाँ 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])
यह प्रश्न कल एक तेज़ रोलिंग_प्रोडक्ट लिखने के मेरे प्रयास से आया था । मुझे एक संचयी उत्पाद को "शिफ्ट" करने के लिए एक तरीका चाहिए था और मुझे लगता है कि तर्क को दोहराने के लिए सभी सोच सकते थे 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