একটি দর্শন ব্যবহার করুন এবং বিনামূল্যে রানটাইম পান! জেনেরিক 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)
তৃতীয় / শেষ অক্ষ বরাবর স্ট্যাক
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()
একটি নমুনা কেসগুলির জন্য তাদের আকারের তথ্যের সাথে দেখানো স্ট্যাকিং কীভাবে দুটি ক্ষেত্রে কাজ করে -
In [55]: arr = np.random.rand(4,5)
In [56]: np.broadcast_to(arr,(3,)+arr.shape).shape
Out[56]: (3, 4, 5)
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)
In [59]: np.broadcast_to(arr,(3,)+arr.shape).shape
Out[59]: (3, 4, 5, 6)
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)
In [62]: np.broadcast_to(arr,(3,)+arr.shape).shape
Out[62]: (3, 4, 5, 6, 7)
In [63]: np.broadcast_to(arr[...,None],arr.shape+(3,)).shape
Out[63]: (4, 5, 6, 7, 3)
ইত্যাদি।
সময়
আসুন একটি বৃহত নমুনা 2D
কেস ব্যবহার করুন এবং সময়গুলি পান এবং আউটপুটটি যাচাই করি view
।
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)
।