हमेशा उपयोग कर सकते हैं np.einsum: उच्च आयामी सरणियों पर
>>> a = np.arange(11*5*5).reshape(11,5,5)
>>> np.einsum('...ijk->...i',a)/(a.shape[-1]*a.shape[-2])
array([ 12, 37, 62, 87, 112, 137, 162, 187, 212, 237, 262])
काम करता है (इन सभी विधियों अक्ष लेबल बदल जाएगा अगर कर रहे हैं):
>>> a = np.arange(10*11*5*5).reshape(10,11,5,5)
>>> (np.einsum('...ijk->...i',a)/(a.shape[-1]*a.shape[-2])).shape
(10, 11)
तेज़ बूट करने के लिए:
a = np.arange(11*5*5).reshape(11,5,5)
%timeit a.reshape(11, 25).mean(axis=1)
10000 loops, best of 3: 21.4 us per loop
%timeit a.mean(axis=(1,2))
10000 loops, best of 3: 19.4 us per loop
%timeit np.einsum('...ijk->...i',a)/(a.shape[-1]*a.shape[-2])
100000 loops, best of 3: 8.26 us per loop
सरणी आकार बढ़ने के साथ अन्य तरीकों के बाद थोड़ा बेहतर स्केल करता है।
dtype=np.float64
का उपयोग पर्याप्त रूप से ऊपर समय परिवर्तन नहीं करता है, तो बस दोहरी जांच करने के लिए:
a = np.arange(110*50*50,dtype=np.float64).reshape(110,50,50)
%timeit a.reshape(110,2500).mean(axis=1)
1000 loops, best of 3: 307 us per loop
%timeit a.mean(axis=(1,2))
1000 loops, best of 3: 308 us per loop
%timeit np.einsum('...ijk->...i',a)/(a.shape[-1]*a.shape[-2])
10000 loops, best of 3: 145 us per loop
इसके अलावा
कुछ है कि दिलचस्प है:
%timeit np.sum(a) #37812362500.0
100000 loops, best of 3: 293 us per loop
%timeit np.einsum('ijk->',a) #37812362500.0
100000 loops, best of 3: 144 us per loop
यह काम करता है? एक ऐसा लगता है कि 1.7 और बाद में, लेकिन दस्तावेज़ अभी भी केवल एक अक्ष कहते हैं। – Jaime
ने numpy संस्करण के बारे में नहीं सोचा था, मेरे पास 1.7.1 है और यह काम करता है। यह प्रलेखन में नहीं है लेकिन चेंजलॉग यूफुनक्स के बारे में बात कर रहा है: http://www.softpedia.com/progChangelog/Numpy-Changelog-103892.html –
कूल, यह नहीं पता था कि यह जोड़ा गया था! – lmjohns3