Как нормализовать значения из матрицы в Python?

#python #opencv

Вопрос:

Я создал сигналы с шумом в коде python. Я сохранил их в массиве — new_array размером(10,17,199,1). Индекс 0 представляет диапазон частот, используемых для создания сигнала, индекс 1 представляет амплитуду, создаваемую этой частотой с различным добавленным шумом (в диапазоне от стандартного отклонения от 0,5 до 2,2 с шагом 0,1), индексы 2 и 3 представляют временную область, т. е. длину массива.

В настоящее время это то, что я произвожу при нормализации …

введите описание изображения здесь. введите описание изображения здесь

Мой вопрос в том, как я могу нормализовать сигнал? Когда я использую предварительную обработку, нормализация сигнала-это не то, что я ожидаю. У кого-нибудь есть какие-нибудь идеи? Я опубликовал свой код ниже.

 import numpy as np 
from sklearn import preprocessing


def frequency_labels(s_frequency):
    L = []
    for w, f2 in enumerate(s_frequency):
        l = " {} Hz".format(f2)
        print("f1=",f2)
        L.append(l)
    return L

def time_labels(time):
    H = []
    for r,t in enumerate(time):
        h = " {} s".format(t)
        H.append(h)
    return H

def gaussian_noise(increment,len_time):
    mean = 0
    standard_deviation = np.arange(0.5,2.2,increment) 
    ## want 8096 different noise signals of different standard deviations
    sd = standard_deviation.reshape(len(standard_deviation),1)
    noise = np.empty((len(sd), (len_time), (1)), dtype=np.float16)
     
    for t, value in enumerate(sd):
         
        noise[t] = np.random.normal(mean,value,len_time).reshape(len_time,1)
        
    return(noise)


max_freq = 50
s_frequency = np.arange(20,30,1) # range of frequencies
fs = 200
time = np.arange(0,2-(1/fs),(1/fs))
amplitude = np.empty((len(time)), dtype=np.float16)
len_time = len(time)
len_frequency = len(s_frequency)
array = np.empty((len(time)), dtype=np.float16)
increment = 0.1  #0.00021
L = frequency_labels(s_frequency)
H = time_labels(time)
k = 0 
noise = gaussian_noise(increment,len_time)
new_array = np.empty((len(s_frequency),(len(noise)),len(time),(1)),dtype=np.float16)

for f1 in s_frequency:

    
    for i, t in enumerate(time):
       
      amplitude[i] = np.sin(2*np.pi*f1*t)
           
    amplitude = amplitude.reshape(len(time),1)
    #n_amplitude = preprocessing.normalize(amplitude)
    new_array[k] = np.add(noise,amplitude)

    for r in range(17):
        new_array[k,r,:,:] = preprocessing.normalize(new_array[k,r,:,:])
        
    k = k   1
 

Ответ №1:

Для последней части кода я использовал (i), чтобы поместить его в диапазон от -1 до 1, и (ii), чтобы поместить его в диапазон от 0 до 1

 (i) new_array[k,r,:,:] = new_array[k,r,:,:]/new_array[k,r,:,:].max(axis=0)
(ii) new_array[k,r,:,:] = (new_array[k,r,:,:] - new_array[k,r,:,:].min(0))/new_array[k,r,:,:].ptp(0)
    
 

Я нашел это решение на одном из форумов в Интернете.