Как добавить новые строки в каждой для l oop в массив, чтобы создать матрицу (m, n) в python? - PullRequest
0 голосов
/ 15 апреля 2020

Я работаю над созданием матрицы объектов из базы данных сигналов.

Я хочу вычислить некоторые функции, чтобы в итоге получить матрицу. Каждая строка соответствует каждому сигналу и 4 столбца соответствуют каждой оцениваемой функции.

Я искал, и я не могу понять, как правильно вставить или добавить новую строку с функциями для каждого сигнала, для каждого для l oop пока я оцениваю функции.

Это код, на котором я слежу:

.mat файл прикреплен к этой ссылке ЗДЕСЬ

import numpy as np
import scipy.io as sio
from scipy import stats

mat=sio.loadmat('signal_1.mat')

size=mat['signal_1']
a,b=size.shape
calc=[]

for i in range(a):

    signal=mat['signal_1'][i][0]

    def function(signal):


        x = signal

        mu=np.mean(x)                          
        mini=np.min(x)
        maxi=np.max(x)
        ran=maxi-mini

        values = np.column_stack((mu,mini,maxi,ran))

        return values

    calc.append(function(signal)) 

, который создает список следующим образом:

This create a list as follows

Это неудобно, потому что мне нужно иметь массив с формой (n , 4), будучи n = a (количество сигналов).

Это желаемый результат:

enter image description here

Подводя итог,

-Как я могу создать список cal c в виде массива float64 с размером (n, 5)?

-Как можно заменить эту строку calc.append(function(signal)), чтобы добавить каждую строку в массив оцениваемых объектов, соответствующих каждому для l oop?

-или наиболее эффективный способ р добавить каждую строку?

*

*

*

*

*

PD : если я попробую это преобразование calc=np.array(calc), оно не сработает и даст мне очень странный массив float64 с размером (9,1,4)

1 Ответ

1 голос
/ 15 апреля 2020

Просто создайте пустой массив features_mat и заполните его своими функциями, повторяя все свои сигналы:

import numpy as np
import scipy.io as sio

mat = sio.loadmat('signal_1.mat')

# number of signals in .mat file
n = mat['signal_1'].shape[0]
# get the signals
signals = mat['signal_1'][:,0]

def get_features(signal):
    mu = np.mean(signal)                          
    mini  = np.min(signal)
    maxi = np.max(signal)
    ran = maxi-mini
    return  np.array([mu,mini,maxi,ran])

# pre-allocate memory without initializing it
features_mat = np.empty((n,4))
for i, signal in enumerate(signals):
    features_mat[i,:] = get_features(signal)


>>> np.array([[ 4.07850385e+00, -2.10251071e-01,  7.06541344e+00, 7.27566451e+00],
              [ 8.31759999e-02, -2.61125020e-03,  1.50838105e-01, 1.53449355e-01],
              [-5.55470935e+00, -5.81185396e+00, -5.17208787e+00, 6.39766089e-01],
              [-1.36478103e+01, -1.46263278e+02,  1.46379425e+02, 2.92642704e+02],
              [ 3.22094459e+00,  1.00760787e+00,  5.55007608e+00, 4.54246820e+00],
              [ 4.36753757e+01,  3.57114093e+01,  4.93010863e+01, 1.35896770e+01],
              [ 1.71242787e+00, -2.25392323e-01,  3.59933423e+00, 3.82472655e+00],
              [-1.73530851e+00, -2.00324815e+00, -1.35313746e+00, 6.50110688e-01],
              [-5.83099184e+00, -6.98125270e+00, -4.75522063e+00, 2.22603207e+00]])

Выход имеет желаемую форму и, кажется, содержит функции, которые вы ищете. Скажите, если это работает.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...