एक दृश्य का उपयोग करें और मुफ्त रनटाइम प्राप्त करें! जेनेरिक बढ़ाएँn-dim
करने के लिए सरणियाँn+1-dim
NumPy1.10.0
में प्रस्तुत , हम इनपुट ऐरे में numpy.broadcast_to
केवल एक 3D
दृश्य उत्पन्न करने के लिए लाभ उठा सकते हैं 2D
। लाभ कोई अतिरिक्त मेमोरी ओवरहेड और वस्तुतः मुक्त रनटाइम होगा। यह उन मामलों में आवश्यक होगा जहां सरणियाँ बड़ी हैं और हम विचारों के साथ काम करने के लिए ठीक हैं। इसके अलावा, यह सामान्य n-dim
मामलों के साथ काम करेगा ।
मैं शब्द का प्रयोग करेंगे stack
के स्थान परcopy
, क्योंकि पाठक इसे मेमोरी कॉपी बनाने वाले सरणियों की नकल के साथ भ्रमित कर सकते हैं।
पहली धुरी के साथ ढेर
यदि हम arr
पहले अक्ष के साथ इनपुट को स्टैक करना चाहते हैं , तो दृश्य np.broadcast_to
बनाने के लिए समाधान 3D
होगा -
np.broadcast_to(arr,(3,)+arr.shape) # N = 3 here
तीसरी / अंतिम धुरी के साथ ढेर
arr
तीसरे अक्ष के साथ इनपुट को ढेर करने के लिए, 3D
दृश्य बनाने का समाधान होगा -
np.broadcast_to(arr[...,None],arr.shape+(3,))
अगर हमें वास्तव में मेमोरी कॉपी की आवश्यकता होती है, तो हम हमेशा .copy()
वहां अपील कर सकते हैं । इसलिए, समाधान होगा -
np.broadcast_to(arr,(3,)+arr.shape).copy()
np.broadcast_to(arr[...,None],arr.shape+(3,)).copy()
यहाँ बताया गया है कि कैसे दो मामलों के लिए स्टैकिंग काम करता है, एक नमूना मामले के लिए उनके आकार की जानकारी के साथ दिखाया गया है -
# Create a sample input array of shape (4,5)
In [55]: arr = np.random.rand(4,5)
# Stack along first axis
In [56]: np.broadcast_to(arr,(3,)+arr.shape).shape
Out[56]: (3, 4, 5)
# Stack along third axis
In [57]: np.broadcast_to(arr[...,None],arr.shape+(3,)).shape
Out[57]: (4, 5, 3)
समान समाधान (एस) पहली और आखिरी कुल्हाड़ियों के साथ आउटपुट देखने के लिए एक n-dim
इनपुट का विस्तार करने के लिए काम करेगा n+1-dim
। आइए कुछ उच्च मंद मामलों की पड़ताल करें -
3 डी इनपुट मामला:
In [58]: arr = np.random.rand(4,5,6)
# Stack along first axis
In [59]: np.broadcast_to(arr,(3,)+arr.shape).shape
Out[59]: (3, 4, 5, 6)
# Stack along last axis
In [60]: np.broadcast_to(arr[...,None],arr.shape+(3,)).shape
Out[60]: (4, 5, 6, 3)
4D इनपुट मामला:
In [61]: arr = np.random.rand(4,5,6,7)
# Stack along first axis
In [62]: np.broadcast_to(arr,(3,)+arr.shape).shape
Out[62]: (3, 4, 5, 6, 7)
# Stack along last axis
In [63]: np.broadcast_to(arr[...,None],arr.shape+(3,)).shape
Out[63]: (4, 5, 6, 7, 3)
और इसी तरह।
समय
आइए एक बड़े नमूना 2D
मामले का उपयोग करें और समय प्राप्त करें और आउटपुट को सत्यापित करें view
।
# Sample input array
In [19]: arr = np.random.rand(1000,1000)
आइए साबित करें कि प्रस्तावित समाधान वास्तव में एक दृश्य है। हम पहले अक्ष के साथ स्टैकिंग का उपयोग करेंगे (परिणाम तीसरी अक्ष के साथ स्टैकिंग के लिए समान होगा) -
In [22]: np.shares_memory(arr, np.broadcast_to(arr,(3,)+arr.shape))
Out[22]: True
चलो यह दिखाने के लिए कि यह वस्तुतः मुफ्त है -
In [20]: %timeit np.broadcast_to(arr,(3,)+arr.shape)
100000 loops, best of 3: 3.56 µs per loop
In [21]: %timeit np.broadcast_to(arr,(3000,)+arr.shape)
100000 loops, best of 3: 3.51 µs per loop
, एक दृश्य होने के नाते में वृद्धि N
से 3
करने के लिए 3000
समय पर बदल कुछ भी नहीं है और दोनों समय इकाइयों पर नगण्य हैं। इसलिए, स्मृति और प्रदर्शन दोनों पर कुशल!
b[:,:,0]
,b[:,:,1]
औरb[:,:,2]
। प्रत्येक तीसरे आयाम का टुकड़ा मूल 2D सरणी की एक प्रति है। यह केवल देखने में उतना स्पष्ट नहीं हैprint(b)
।