बहु-आयामी टेंसर/सरणी में array-slicing
का अभ्यास करने के लिए बड़ी समस्या!
हम आउटपुट सरणी को बहु-आयामी 6D
सरणी के रूप में प्रारंभ करेंगे और बस इसे टुकड़ा कर लेंगे और चार एरे को 4D
सरणी के रूप में पुनः आकार दिया जाएगा। इरादा किसी भी स्टैकिंग/कॉन्सटेनेटिंग से बचने के लिए है क्योंकि यह विशेष रूप से महंगा होगा क्योंकि बड़े सरणी के साथ काम करते हुए इनपुट एरे के दोबारा बदलने के साथ काम करना होगा, जो केवल विचार होंगे।
यहाँ कार्यान्वयन है -
out = np.zeros((N,2,3,N,2,3),dtype=A.dtype)
out[:,0,:,:,0,:] = A.reshape(N,3,N,3)
out[:,0,:,:,1,:] = D.reshape(N,3,N,3)
out[:,1,:,:,0,:] = C.reshape(N,3,N,3)
out[:,1,:,:,1,:] = B.reshape(N,3,N,3)
out.shape = (6*N,6*N)
बस में और व्याख्या करने के लिए, हम था:
|------------------------ Axes for selecting A, B, C, D
np.zeros((N,2,3,N,2,3),dtype=A.dtype)
|------------------------- Axes for selecting A, B, C, D
इस प्रकार, लंबाई (2x2) = 4
की उन दो कुल्हाड़ियों (दूसरा और पांचवें) के बीच चयन करने के लिए इस्तेमाल किया गया चार इनपुट।
रनटाइम परीक्षण
प्रयास -
def original_app(A, B, C, D):
final = np.zeros((6*N,6*N),dtype=A.dtype)
for i in range(N):
for j in range(N):
for k in range(3):
for l in range(3):
final[6*i + k][6*j + l] = A[3*i+k][3*j+l]
final[6*i + k + 3][6*j + l + 3] = B[3*i+k][3*j+l]
final[6*i + k + 3][6*j + l] = C[3*i+k][3*j+l]
final[6*i + k][6*j + l + 3] = D[3*i+k][3*j+l]
return final
def slicing_app(A, B, C, D):
out = np.zeros((N,2,3,N,2,3),dtype=A.dtype)
out[:,0,:,:,0,:] = A.reshape(N,3,N,3)
out[:,0,:,:,1,:] = D.reshape(N,3,N,3)
out[:,1,:,:,0,:] = C.reshape(N,3,N,3)
out[:,1,:,:,1,:] = B.reshape(N,3,N,3)
return out.reshape(6*N,6*N)
समय और सत्यापन -
In [147]: # Setup input arrays
...: N = 200
...: A = np.random.randint(11,99,(3*N,3*N))
...: B = np.random.randint(11,99,(3*N,3*N))
...: C = np.random.randint(11,99,(3*N,3*N))
...: D = np.random.randint(11,99,(3*N,3*N))
...:
In [148]: np.allclose(slicing_app(A, B, C, D), original_app(A, B, C, D))
Out[148]: True
In [149]: %timeit original_app(A, B, C, D)
1 loops, best of 3: 1.63 s per loop
In [150]: %timeit slicing_app(A, B, C, D)
100 loops, best of 3: 9.26 ms per loop
(ऑफ-विषय) | मैं खुद से सोच रहा था, केवल एक बार मैंने सुना है कि "numpythonic" SO पर कुछ अन्य व्यक्ति था। लेकिन फिर मैंने जांच की और वह भी आप थे :) – miradulo
@ लगभग एक * टॉनिक * मिच। – Divakar
हां, मैं एक न्यूम्प्थोनिक तरीके से लूप बनाने के विभिन्न तरीकों से लड़ रहा हूं। आंख एक गलती है, यह शून्य होना चाहिए। – NunodeSousa