سؤال

بعد إجراء بعض المعالجة على مصفوفة صوت أو صورة، يجب تطبيعها ضمن نطاق قبل أن تتمكن من كتابتها مرة أخرى إلى ملف.يمكن القيام بذلك على النحو التالي:

# 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() لا يبدو أن تكون ذات صلة.

هل كانت مفيدة؟

المحلول

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

نظرا لأننا نستخدم أساليب Numpy الأساسية هنا، أعتقد أن هذا يدور حول حلا فعالا في Numpy كما هو.


العمليات الموضعية لا تغير DTYPE من صفيف الحاوية. منذ القيم الطبيعية المطلوبة هي العوامات، audio و image تحتاج المصفوفات إلى نقطة DTYPE نقطة عائمة قبل تنفيذ العمليات القائمة. إذا لم تكن بالفعل من Dettype النقطة العائمة، فستحتاج إلى تحويلها باستخدام astype. وبعد علي سبيل المثال،

image = image.astype('float64')

نصائح أخرى

إذا كان الصفيف يحتوي على بيانات إيجابية وسالبة، سأذهب مع:

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
c = 255*(a - np.min(a))/np.ptp(a).astype(int)

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

أيضا، جدير بالذكر حتى لو لم يكن سؤال OP، التوحيد:

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

يمكنك أيضًا إعادة القياس باستخدام 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.توثيق هنا.

يمكنك استخدام إصدار "i" (كما هو الحال في إصدار IDIV، IMUL ..)، ولا يبدو نصف سيء:

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

للحالة الأخرى، يمكنك كتابة وظيفة لتطبيع صفيف N- الأبعاد من قبل Colums:

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

الحل البسيط يستخدم المسايمين المقدم من مكتبة sklearn.preocessing.

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 سيكون صفر. يمكنك ضبط Feasual_Range لاحتياجاتك، أو حتى استخدام Squaler Scaler SK.StandardScaler ()

أنت تحاول Min-Max نطاق القيم 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)، والذي يشار إليه عادة باسم التطبيع.

حاولت متابعتها هذه, ، وحصلت على الخطأ

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 مجموعة مصفوفة. يبدو أنهم مهمون نوع الصب في الإصدارات> 1.10, ، وعليك استخدام numpy.true_divide() لحل ذلك.

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

img كان PIL.Image هدف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top