পাইথন নুমপাইতে এনপি.মেন () বনাম এনপি.এভারেজ ()?


189

আমি সেটা দেখেছি

In [30]: np.mean([1, 2, 3])
Out[30]: 2.0

In [31]: np.average([1, 2, 3])
Out[31]: 2.0

যাইহোক, কিছু পার্থক্য থাকা উচিত, যেহেতু সর্বোপরি সেগুলি দুটি পৃথক ফাংশন।

তাদের মধ্যে পার্থক্য কি কি?


20
আসলে, দস্তাবেজগুলি যত তাড়াতাড়ি আমি দেখতে পাচ্ছি তা তত্ক্ষণাত্ পরিষ্কার করে দেয় না। এটি বলা অসম্ভব বলছেন না, তবে আমি মনে করি এই প্রশ্নটি স্ট্যাক ওভারফ্লোর জন্য একই রকম।
ব্ল্যাকজেটেবল

1
numpy.mean: অ্যারের উপাদানগুলির গড় প্রদান করে।
জোয়াকুইন

@ জোআকুইন: "নির্দিষ্ট অক্ষ বরাবর গণিতের গড় গণনা করুন।" বনাম "নির্দিষ্ট অক্ষ বরাবর ভারী গড় গণনা করুন?"
ব্লেন্ডার

@ ব্লেন্ডার ঠিক আছে আমি শুধু আপনার মন্তব্যের মজার প্রতিক্রিয়া এক ধরনের পরিণত করতে পারবে কারন আমি যদি আপনার নির্দেশাবলী প্রথম জিনিস আমি পড়তে অনুসরণ চেষ্টা ছিল numpy.mean এর জন্য দস্তাবেজ হয় numpy.mean: অ্যারের উপাদানের গড়কে যা মজার হলে তুমি ওপি প্রশ্নের উত্তর খুঁজছেন।
জোয়াকুইন

উত্তর:


180

np.average একটি alচ্ছিক ওজন পরামিতি নেয়। যদি সরবরাহ না করা হয় তবে তারা সমান। উত্স কোডটি একবার দেখুন: গড় , গড়

np.mean:

try:
    mean = a.mean
except AttributeError:
    return _wrapit(a, 'mean', axis, dtype, out)
return mean(axis, dtype, out)

np.average:

...
if weights is None :
    avg = a.mean(axis)
    scl = avg.dtype.type(a.size/avg.size)
else:
    #code that does weighted mean here

if returned: #returned is another optional argument
    scl = np.multiply(avg, 0) + scl
    return avg, scl
else:
    return avg
...

59
কেন তারা দুটি ভিন্ন ফাংশন অফার করে? ইতিমধ্যে alচ্ছিক np.averageযেহেতু তাদের কেবল প্রস্তাব দেওয়া উচিত weights। অপ্রয়োজনীয় বলে মনে হচ্ছে এবং এটি কেবল ব্যবহারকারীদের বিভ্রান্ত করার জন্য কাজ করে।
জিওফ

6
@ জিওফের পরিবর্তে আমি তাদের "গড়" এর জন্য একটি নটি-ইমপ্লিমিটেড এক্সেপশন নিক্ষেপ করতে চাইছি, ব্যবহারকারীদের শিক্ষিত করতে যে পাটিগণিতের গড়টি "গড়" এর মতো নয়।
ফুবু

26

np.mean সর্বদা একটি গাণিতিক গড় গণনা করে, এবং ইনপুট এবং আউটপুট জন্য কিছু অতিরিক্ত বিকল্প রয়েছে (যেমন কোন ডেটাটাইপগুলি ব্যবহার করতে হবে, ফলাফলটি কোথায় রাখবেন)।

np.averageযদি weightsপ্যারামিটার সরবরাহ করা হয় তবে একটি ওজনযুক্ত গড় গণনা করতে পারে ।


24

নমির কিছু সংস্করণে আরও একটি অপ্রয়োজনীয় পার্থক্য রয়েছে যা আপনাকে সচেতন হতে হবে:

average অ্যাকাউন্টে মুখোশ নেবেন না, সুতরাং সম্পূর্ণ ডেটার পুরো সেটটির তুলনায় গড় গণনা করুন।

mean অ্যাকাউন্টে মুখোশ নেবে, সুতরাং কেবল আনমস্ক করা মানগুলির চেয়ে গড় গণনা করুন।

g = [1,2,3,55,66,77]
f = np.ma.masked_greater(g,5)

np.average(f)
Out: 34.0

np.mean(f)
Out: 2.0

1
দ্রষ্টব্য: np.ma.averageকাজ করে। এছাড়াও, একটি হল বাগ রিপোর্ট
নীল জি


0

ইতিমধ্যে উল্লিখিত পার্থক্যগুলি ছাড়াও, আরও একটি অত্যন্ত গুরুত্বপূর্ণ পার্থক্য রয়েছে যা আমি এখনই শক্ত উপায়টি আবিষ্কার করেছি: এর বিপরীতে np.mean, মূলশব্দটিকে np.averageঅনুমতি দেয় না dtype, যা কিছু ক্ষেত্রে সঠিক ফলাফল পাওয়ার জন্য প্রয়োজনীয় essential আমার কাছে খুব বড় একক-নির্ভুল অ্যারে রয়েছে যা কোনও h5ফাইল থেকে অ্যাক্সেস করা যায় । আমি যদি 0 এবং 1 অক্ষের সাথে গড়টি গ্রহণ করি তবে আমি উল্লেখ না করে বন্যভাবে ভুল ফল পেয়েছি dtype='float64':

>T.shape
(4096, 4096, 720)
>T.dtype
dtype('<f4')

m1 = np.average(T, axis=(0,1))                #  garbage
m2 = np.mean(T, axis=(0,1))                   #  the same garbage
m3 = np.mean(T, axis=(0,1), dtype='float64')  # correct results

দুর্ভাগ্যক্রমে, আপনি কী সন্ধান করবেন তা না জানলে আপনি অগত্যা আপনার ফলাফলগুলি ভুল বলে দিতে পারবেন না। আমি np.averageএই কারণে আর কখনও ব্যবহার করব না তবে সর্বদা যে np.mean(.., dtype='float64')কোনও বড় অ্যারে ব্যবহার করব । যদি আমি একটি ওজনযুক্ত গড় চাই, আমি ওজন ভেক্টর এবং লক্ষ্য অ্যারের পণ্যটি ব্যবহার করে এবং তারপরে np.sumবা np.meanযথাযথভাবে (যথাযথ যথাযথতা সহ) ব্যবহার করে এটি স্পষ্টভাবে গণনা করব ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.