Как можно объединить 3 матрицы в 1 матрицу с помощью обратимого подхода? - PullRequest
0 голосов
/ 05 февраля 2019

Я хочу изменить мои матрицы 24x20 'A', 'B', 'C', которые извлечены из текстового файла и сохранены до и после нормализации на def normalize() в циклах for-loopтаким образом, чтобы каждый цикл был строкой со всеми элементами из 3 матриц рядом, как показано ниже:

[[A(1,1),B(1,1),C(1,1),A(1,2),B(1,2),C(1,2),...,A(24,20),B(24,20),C(24,20)] #cycle1
 [A(1,1),B(1,1),C(1,1),A(1,2),B(1,2),C(1,2),...,A(24,20),B(24,20),C(24,20)] #cycle2
 [A(1,1),B(1,1),C(1,1),A(1,2),B(1,2),C(1,2),...,A(24,20),B(24,20),C(24,20)]] #cycle3

До сих пор, основываясь на предложении @odyse, я использовал следующий фрагмент в конце цикла for:

for cycle in range(cycles):
dff = pd.DataFrame({'A_norm':A_norm[cycle] , 'B_norm': B_norm[cycle] , 'C_norm': C_norm[cycle] } , index=[0])
D = dff.as_matrix().ravel()
if cycle == 0:
    Results = np.array(D)
else:
    Results = np.vstack((Results, D2))
np.savetxt("Results.csv", Results, delimiter=",") 

но есть проблема, когда я использую после def normalize() в цикле for, несмотря на свою ошибку (ValueError), он также имеет warning FutureWarning: Method .as_matrix will be removed in a future version. Use .values instead для D = dff.as_matrix().ravel(), что не важно, но сейчастак как это FutureWarning, тем не менее я проверил правильную форму вывода для 3 циклов, используя print(data1.shape), и это было (3, 1440) , что составляет 3 строки как 3 цикла, а количество столбцов должно быть 3 раза480 = 1440, но в целом это не стабильное решение.

полные сценарии следующие:

import numpy as np
import pandas as pd
import os

def normalize(value, min_value, max_value, min_norm, max_norm):
    new_value = ((max_norm - min_norm)*((value - min_value)/(max_value - min_value))) + min_norm
    return new_value

#the size of matrices are (24,20)
df1 = np.zeros((24,20))
df2 = np.zeros((24,20))
df3 = np.zeros((24,20))


#next iteration create all plots, change the number of cycles
cycles = int(len(df)/480)
print(cycles)
for cycle in range(3):
    count =  '{:04}'.format(cycle)
    j = cycle * 480
    new_value1 = df['A'].iloc[j:j+480]
    new_value2 = df['B'].iloc[j:j+480]
    new_value3 = df['C'].iloc[j:j+480]
    df1 = print_df(mkdf(new_value1))
    df2 = print_df(mkdf(new_value2))
    df3 = print_df(mkdf(new_value3))              
    for i in df:
        try:
            os.mkdir(i)
        except:
            pass
        min_val = df[i].min()
        min_nor = -1
        max_val = df[i].max()
        max_nor = 1
        ordered_data = mkdf(df.iloc[j:j+480][i])
        csv = print_df(ordered_data)
        #Print .csv files contains matrix of each parameters by name of cycles respectively
        csv.to_csv(f'{i}/{i}{count}.csv', header=None, index=None)            
        if 'C' in i:
            min_nor = -40
            max_nor = 150
            #Applying normalization for C between [-40,+150]
            new_value3 = normalize(df['C'].iloc[j:j+480], min_val, max_val, -40, 150)
            C_norm = print_df(mkdf(new_value3))
            C_norm.to_csv(f'{i}/norm{i}{count}.csv', header=None, index=None)  
        else:
            #Applying normalization for A,B between    [-1,+1]
            new_value1 = normalize(df['A'].iloc[j:j+480], min_val, max_val, -1, 1)
            new_value2 = normalize(df['B'].iloc[j:j+480], min_val, max_val, -1, 1)
            A_norm = print_df(mkdf(new_value1))
            B_norm = print_df(mkdf(new_value2))
            A_norm.to_csv(f'{i}/norm{i}{count}.csv', header=None, index=None) 
            B_norm.to_csv(f'{i}/norm{i}{count}.csv', header=None, index=None)
    dff = pd.DataFrame({'A_norm':A_norm[cycle] , 'B_norm': B_norm[cycle] , 'C_norm': C_norm[cycle] } , index=[0])
    D = dff.as_matrix().ravel()
    if cycle == 0:
        Results = np.array(D)
    else:
        Results = np.vstack((Results, D))
    np.savetxt("Results.csv", Results , delimiter=',', encoding='utf-8')
#Check output shape whether is (3, 1440) or not 
data1 = np.loadtxt('Results.csv', delimiter=',')
print(data1.shape)  

Примечание1: мои данныеЭто TXT-файл следующий:

id_set: 000
     A: -2.46882615679
     B: -2.26408246559
     C: -325.004619528 

Примечание 2: Я предоставил набор данных в текстовом файле для 3 циклов: Набор текстовых данных

Примечание 3: для отображения параметров A, B, C в матрицы в правильном порядке, который я использовалprint_df() mkdf() функций, но я не упомянул из-за того, чтобы свести это к основной проблеме и просто оставить минимальный пример в начале этого поста.Дайте мне знать, если вам это нужно.

Ожидаемый результат должен быть достигнут путем заполнения for-loop на 'A_norm', 'B_norm', 'C_norm', которыепредставлены нормализованные версии 'A', 'B', 'C' соответственно и вывод, назовем его «Results.csv» должен быть обратимым для регенерации 'A', 'B', 'C' матриц черезциклы снова сохраняют их в CSV.файлы для управления, поэтому, если у вас есть идеи по поводу обратной части, пожалуйста, отметьте, что отдельно, в противном случае, просто контролируйте ее, используя print(data.shape), и она должна быть (3, 1440) .Хорошего дня и спасибо заранее!

...