একটি নির্দিষ্ট পরিসরের মধ্যে একটি NumPy অ্যারে কিভাবে স্বাভাবিক করবেন?


136

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

# Normalize audio channels to between -1.0 and +1.0
audio[:,0] = audio[:,0]/abs(audio[:,0]).max()
audio[:,1] = audio[:,1]/abs(audio[:,1]).max()

# Normalize image to between 0 and 255
image = image/(image.max()/255.0)

এটি করার জন্য কোনও কম ভার্বোস, সুবিধাজনক কার্যকারিতা আছে কি? matplotlib.colors.Normalize()সম্পর্কিত বলে মনে হচ্ছে না।

উত্তর:


137
audio /= np.max(np.abs(audio),axis=0)
image *= (255.0/image.max())

ব্যবহার /=এবং *=আপনাকে একটি মধ্যবর্তী অস্থায়ী অ্যারে অপসারণ করতে দেয়, এইভাবে কিছু স্মৃতি সঞ্চয় করে। গুণগুলি বিভাগের চেয়ে কম ব্যয়বহুল, তাই

image *= 255.0/image.max()    # Uses 1 division and image.size multiplications

তুলনায় সামান্য দ্রুত

image /= image.max()/255.0    # Uses 1+image.size divisions

যেহেতু আমরা এখানে বেসিক নিম্পি পদ্ধতিগুলি ব্যবহার করছি, আমি মনে করি এটি নমনীর ক্ষেত্রে যতটা কার্যকর সমাধান হতে পারে তেমন দক্ষ।


ইন-প্লেস অপারেশনগুলি ধারক অ্যারের dtype পরিবর্তন করে না। যেহেতু পছন্দসই নরমালাইজড মানগুলি ভাসমান, তাই স্থানটিতে ক্রিয়াকলাপ সম্পাদনের আগে audioএবং imageঅ্যারেগুলিতে ভাসমান-পয়েন্ট পয়েন্ট dtype থাকা দরকার। যদি তারা ইতিমধ্যে ভাসমান-পয়েন্টের টাইপ না করে থাকে তবে আপনাকে সেগুলি ব্যবহার করে রূপান্তর করতে হবে astype। উদাহরণ স্বরূপ,

image = image.astype('float64')

7
ভাগের চেয়ে গুণ কেন কম ব্যয়বহুল?
এন্ডোলিথ

19
আমি ঠিক জানি না কেন। যাইহোক, আমি দাবিটি সম্পর্কে আস্থাশীল, সময়কাল সহ এটি যাচাই করে ফেলেছি। গুণনের সাথে, আপনি একবারে একটি ডিজিট দিয়ে কাজ করতে পারেন। বিভাগের সাথে, বিশেষত বড় বিভাজকগুলির সাথে আপনাকে অনেকগুলি সংখ্যা নিয়ে কাজ করতে হবে এবং বিভাজক কতবার ডিভিডেন্ডে যায় তা "অনুমান" করুন। একটি বিভাগের সমস্যা সমাধানের জন্য আপনি বহু গুণগুলি করছেন। বিভাগ করার জন্য কম্পিউটার অ্যালগরিদম মানব দীর্ঘ বিভাগের মতো নাও হতে পারে তবে তবুও আমি বিশ্বাস করি এটি গুণণের চেয়ে জটিল।
unutbu

14
ফাঁকা চিত্রগুলির জন্য সম্ভবত শূন্য দ্বারা একটি বিভাজন উল্লেখযোগ্য।
cjm2671

7
@endolith গুণটি বিধানসভা স্তরের তুলনায় কার্যকর হওয়ার কারণে বিভাগের চেয়ে কম ব্যয়বহুল। বিভাগ অ্যালগরিদমগুলি পাশাপাশি গুণিত অ্যালগরিদমের সমান্তরাল করা যায় না। en.wikipedia.org/wiki/Binary_multiplier
mjones.udri

5
গুণনের পক্ষে বিভাগের সংখ্যা হ্রাস করা একটি ভাল জানা অপ্টিমাইজেশন কৌশল।
mjones.udri

73

যদি অ্যারেটিতে ইতিবাচক এবং নেতিবাচক উভয় ডেটা থাকে তবে আমি সাথে যাব:

import numpy as np

a = np.random.rand(3,2)

# Normalised [0,1]
b = (a - np.min(a))/np.ptp(a)

# Normalised [0,255] as integer: don't forget the parenthesis before astype(int)
c = (255*(a - np.min(a))/np.ptp(a)).astype(int)        

# Normalised [-1,1]
d = 2.*(a - np.min(a))/np.ptp(a)-1

অ্যারেটি অন্তর্ভুক্ত থাকলে nanএকটি সমাধান হ'ল কেবল সেগুলি মুছে ফেলা হবে:

def nan_ptp(a):
    return np.ptp(a[np.isfinite(a)])

b = (a - np.nanmin(a))/nan_ptp(a)

তবে, প্রসঙ্গের উপর নির্ভর করে আপনি nanঅন্যরকম আচরণ করতে চাইতে পারেন । উদাহরণস্বরূপ 0 দিয়ে প্রতিস্থাপন করে মানটি ফাঁক করুন বা একটি ত্রুটি বাড়ান।

অবশেষে, এটি ওপির প্রশ্ন, মানক না হওয়ার পরেও উল্লেখ করার মতো :

e = (a - np.mean(a)) / np.std(a)

2
আপনি যা চান তার উপর নির্ভর করে এটি সঠিক নয়, কারণ এটি ডেটা উল্টায়। উদাহরণস্বরূপ [0, 1] এ নর্মালাইজেশন সর্বাধিক 0 এবং নূন্যতম 1 এ রাখে [0, 1] এর জন্য, আপনি সঠিক স্বাভাবিককরণ পেতে 1 থেকে ফলাফলকে বিয়োগ করতে পারেন।
অ্যালান টুরিং

এটি অ্যালাউটুরিংকে দেখানোর জন্য ধন্যবাদ যা খুব আস্তে আস্তে ছিল। পোস্ট হিসাবে কোডটি কেবলমাত্র কাজ করে যদি ডেটাতে ইতিবাচক এবং নেতিবাচক উভয় মান থাকে। এটি অডিও ডেটার জন্য বরং সাধারণ হতে পারে। যাইহোক, কোনও বাস্তব মানগুলি স্বাভাবিক করতে উত্তর আপডেট করা হয়।
টেকটোপোডা

1
শেষ এক হিসাবে উপলব্ধ scipy.stats.zscore
লুইস্ট্রিক

d নমুনার চিহ্নটি উল্টাতে পারে। আপনি যদি সাইন রাখতে চান তবে আপনি ব্যবহার করতে পারেন: f = a / np.max(np.abs(a))... যদি না পুরো অ্যারেটি সমস্ত জিরো (DivideByZero এড়ান)।
পিমিন কনস্ট্যান্টিন কেফলালোকস

1
numpy.ptp()0 প্রদান করে, যদি এটি ব্যাপ্তি হয় তবে অ্যারেতে nanযদি একটি থাকে nan। তবে, পরিসীমা 0 হলে স্বাভাবিককরণ সংজ্ঞায়িত হয় না। আমরা 0 দিয়ে ভাগ করার চেষ্টা করার সাথে সাথে এটি একটি ত্রুটি উত্থাপন করে
টেকটোপোদা

37

আপনি ব্যবহার করে পুনরুদ্ধার করতে পারেন sklearn। সুবিধাগুলি হ'ল আপনি স্ট্যান্ডার্ড বিচ্যুতি সামঞ্জস্য করতে পারেন, ডেটা-কেন্দ্রিককরণ ছাড়াও, এবং বৈশিষ্ট্য দ্বারা বা রেকর্ডগুলির মাধ্যমে আপনি যে কোনও অক্ষতে এটি করতে পারেন।

from sklearn.preprocessing import scale
X = scale( X, axis=0, with_mean=True, with_std=True, copy=True )

শব্দ আর্গুমেন্ট axis, with_mean, with_stdস্ব ব্যাখ্যামূলক আছে, এবং তাদের ডিফল্ট স্থিতি দেখানো হয়। copyযদি সেট করা থাকে তবে যুক্তিটি স্থানে অপারেশন সম্পাদন করে False। ডকুমেন্টেশন এখানে


এক্স = স্কেল ([1,2,3,4], অক্ষ = 0, উইথ মিয়ান = ট্রু, উইথস্টেস্ট = ট্রু, কপি = ট্রু) আমাকে একটি ত্রুটি দেয়
Yfiua

এক্স = স্কেল (এনপি.আরে ([1,2,3,4]), অক্ষ = 0, উইথ_মেন = ট্রু, উইথ_স্টডি = ট্রু, কপি = ট্রু) আমাকে [0,0,0,0] এর অ্যারে দেয়
Yfiua

sklearn.preprocessing.scale () এর ব্যাকড্র রয়েছে যা আপনি জানেন না কী চলছে। ফ্যাক্টরটি কী? বিরতি কি সংকোচনের?
মাস্টারকন্ট্রোল প্রোগ্রাম

এই সাইকিট প্রিপ্রোসেসিং পদ্ধতিগুলি (স্কেল, মিনম্যাক্স_স্কেল, ম্যাকাবস_স্কেল) কেবলমাত্র একটি অক্ষের সাথে ব্যবহৃত হবে (সুতরাং উভয়ই নমুনা (সারি) বা বৈশিষ্ট্যগুলি (কলামগুলি পৃথক পৃথকভাবে স্কেল করুন This এটি কোনও মেশিন ফাঁসির সেটআপে উপলব্ধি করে তবে কখনও কখনও আপনি চান পুরো অ্যারেতে পরিসীমা গণনা করতে, বা দুটি মাত্রার বেশি দিয়ে অ্যারে ব্যবহার করতে পারেন
টবি

11

আপনি "i" (যেমন idiv, imul ..) সংস্করণটি ব্যবহার করতে পারেন, এবং এটি অর্ধেক খারাপ দেখাচ্ছে না:

image /= (image.max()/255.0)

অন্য ক্ষেত্রে আপনি কলাম দ্বারা একটি এন-ডাইমেনশনাল অ্যারে স্বাভাবিক করতে একটি ফাংশন লিখতে পারেন:

def normalize_columns(arr):
    rows, cols = arr.shape
    for col in xrange(cols):
        arr[:,col] /= abs(arr[:,col]).max()

আপনি এই পরিষ্কার করতে পারেন? প্রথম বন্ধনীগুলি এটি ছাড়া ভিন্ন আচরণ করে?
এন্ডোলিথ

1
প্যারান্থিস কিছুই পরিবর্তন করে না। পয়েন্টটি ব্যবহার করতে /=হবে = .. / ..
u0b34a0f6ae

7

আপনি audio-1 এবং +1 এর imageমধ্যে এবং 0 এবং 255 এর মধ্যে সর্বনিম্ন স্কেল করার চেষ্টা করছেন ।

ব্যবহার করে sklearn.preprocessing.minmax_scale, সহজেই আপনার সমস্যার সমাধান করা উচিত।

উদাহরণ:

audio_scaled = minmax_scale(audio, feature_range=(-1,1))

এবং

shape = image.shape
image_scaled = minmax_scale(image.ravel(), feature_range=(0,255)).reshape(shape)

দ্রষ্টব্য : অপারেশনের সাথে বিভ্রান্ত হওয়ার দরকার নেই যা ভেক্টরের আদর্শ (দৈর্ঘ্য) কে একটি নির্দিষ্ট মানকে (সাধারণত 1) স্কেল করে যা সাধারণভাবে সাধারণীকরণ হিসাবেও পরিচিত।


4

একটি সহজ সমাধান হ'ল স্ক্লেয়ার.প্রিপ্রসেসিং লাইব্রেরি দ্বারা প্রদত্ত স্কেলারগুলি ব্যবহার করা।

scaler = sk.MinMaxScaler(feature_range=(0, 250))
scaler = scaler.fit(X)
X_scaled = scaler.transform(X)
# Checking reconstruction
X_rec = scaler.inverse_transform(X_scaled)

ত্রুটি X_rec-X শূন্য হবে। আপনি আপনার প্রয়োজনের জন্য ফিচার_আরজজ সামঞ্জস্য করতে পারেন, বা এমনকি স্ট্যান্ডার্ড স্কেলারের স্ক ব্যবহার করতে পারেন tand স্ট্যান্ডার্ডস্কেলার ()


3

আমি নিম্নলিখিত চেষ্টা এই , এবং ত্রুটিটি পেয়েছিলেন

TypeError: ufunc 'true_divide' output (typecode 'd') could not be coerced to provided output parameter (typecode 'l') according to the casting rule ''same_kind''

numpyআমি যে অ্যারেটি স্বাভাবিক করার চেষ্টা করছিলাম সেটি ছিল একটি integerঅ্যারে। দেখে মনে হচ্ছে তারা সংস্করণগুলিতে> ingালাই টাইপ করা বাতিল করেছেন 1.10এবং numpy.true_divide()এটি সমাধান করার জন্য আপনাকে ব্যবহার করতে হবে।

arr = np.array(img)
arr = np.true_divide(arr,[255.0],out=None)

imgএকটি PIL.Imageবস্তু ছিল ।

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