बाद-अप से इस सवाल का साल पहले, वहाँ 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