2012-05-09 31 views
8

मेरे पास एक नम्पी 3 अक्ष सरणी है जिसका तत्व 3 आयामी हैं। मैं उन्हें औसत देना चाहता हूं और सरणी के समान आकार को वापस करना चाहता हूं। सामान्य औसत समारोह 3 आयामों दूर करता है और औसत से बदलने (अपेक्षित रूप से):औसत numpy सरणी लेकिन आकार

a = np.array([[[0.1, 0.2, 0.3], [0.2, 0.3, 0.4]], 
       [[0.4, 0.4, 0.4], [0.7, 0.6, 0.8]]], np.float32) 

b = np.average(a, axis=2) 
# b = [[0.2, 0.3], 
#  [0.4, 0.7]] 

परिणाम अपेक्षित:

# b = [[[0.2, 0.2, 0.2], [0.3, 0.3, 0.3]], 
#  [[0.4, 0.4, 0.4], [0.7, 0.7, 0.7]]] 

आप इस सुंदर ढंग से करते हैं या मैं बस पुनरावृति करना है कर सकते हैं पायथन में सरणी के ऊपर (जो एक शक्तिशाली नम्पी फ़ंक्शन की तुलना में बहुत धीमी होगी)।

क्या आप dppe तर्क को np.mean फ़ंक्शन के लिए, शायद 1 डी सरणी में सेट कर सकते हैं?

धन्यवाद।

+2

आप क्या सवाल में देखना चाहते हैं की बड़ी प्रशंसक धुरी है। – lukecampbell

+0

ज्यादातर मामलों में मैं कल्पना कर सकता हूं, प्रसारण 3 डी सरणी की आवश्यकता के बिना करेगा। – tillsten

उत्तर

3
>>> import numpy as np 
>>> a = np.array([[[0.1, 0.2, 0.3], [0.2, 0.3, 0.4]], 
...    [[0.4, 0.4, 0.4], [0.7, 0.6, 0.8]]], np.float32) 
>>> b = np.average(a, axis=2) 
>>> b 
array([[ 0.2  , 0.29999998], 
     [ 0.40000001, 0.69999999]], dtype=float32) 
>>> c = np.dstack((b, b, b)) 
>>> c 
array([[[ 0.2  , 0.2  , 0.2  ], 
     [ 0.29999998, 0.29999998, 0.29999998]], 

     [[ 0.40000001, 0.40000001, 0.40000001], 
     [ 0.69999999, 0.69999999, 0.69999999]]], dtype=float32) 
+0

यह क्यों कम हो रहा है? – AJP

6

ठीक है, चेतावनी मैं अभी तक numpyology में मेरे स्वामी की जरूरत नहीं है, लेकिन सिर्फ चारों ओर खेल रहा है, मैं के साथ आया था:

>>> np.average(a,axis=-1).repeat(a.shape[-1]).reshape(a.shape) 
array([[[ 0.2  , 0.2  , 0.2  ], 
     [ 0.29999998, 0.29999998, 0.29999998]], 

     [[ 0.40000001, 0.40000001, 0.40000001], 
     [ 0.69999999, 0.69999999, 0.69999999]]], dtype=float32) 
+0

मुझे यह पसंद है, यह मेरे साथ आने के मुकाबले बेहतर है। – lukecampbell

+0

यह अच्छी तरह से काम करता है .... लॉबस्टर या बागो के उत्तरों पर कोई फायदा? – AJP

+0

यह एक पंक्ति है और यह सभी सरणी आकारों और आकारों के लिए काम करती है जब तक आप अंतिम अक्ष के साथ औसत ले रहे हों। – user545424

5

आप प्रसारण का उपयोग कर विचार किया है? Here यदि आप अवधारणा के लिए नए हैं तो प्रसारण के बारे में अधिक जानकारी है।

यहाँ broadcast_arrays का उपयोग कर एक उदाहरण है, कि bbroadcast_arrays द्वारा यहां उत्पादित के रूप में केवल पढ़ने के लिए इलाज किया जाना चाहिए ध्यान में रखना है, तो आप एक प्रतिलिपि बनाने चाहिए यदि आप इसे करने के लिए लिखना चाहते हैं:

>>> b = np.average(a, axis=2)[:, :, np.newaxis] 
>>> b, _ = np.broadcast_arrays(b, a) 
>>> b 
array([[[ 0.2  , 0.2  , 0.2  ], 
     [ 0.29999998, 0.29999998, 0.29999998]], 

     [[ 0.40000001, 0.40000001, 0.40000001], 
     [ 0.69999999, 0.69999999, 0.69999999]]], dtype=float32) 
+0

यह एक शानदार लिंक है, धन्यवाद। – AJP

+0

और एक अच्छा जवाब भी। – AJP

1

यहाँ है एक विधि है कि बनाने प्रतियां से बचा जाता है:

a = a.T 
a[:] = a.mean(axis=0) 
a = a.T 

या आप अधिलेखित करने के लिए नहीं चाहते हैं तो a:

b = np.empty_like(a) 
b = b.T 
b[:] = a.mean(axis=-1).T 
b = b.T 
+0

और एक और महान जवाब। मैं कैसे चुनूं ?! धन्यवाद! :) – AJP

0

यह एक मनमाना धुरी के लिए है:

array ndimentional सरणी है और axis लिए औसत

np.repeat(np.expand_dims(np.mean(array, axis), axis), array.shape[axis], axis)