파이썬 코딩 질문있습니다!!
우선 소스코드에서 입력받는 파일은 모두 텍스트 파일입니다.
허밍파일은 4개가 있고 뮤직파일은 100개가 존재합니다. 허밍파일중 하나를 입력받아 뮤직파일 100개와 비교하여 가장 비슷한 뮤직파일 5개를 출력하는 프로그램인데요..
허밍파일을 하나 입력받고 뮤직파일은 폴더를 통으로 입력받아서 100개를 한번에 비교할 수 있도록 하였습니다.
제가 질문이 있는 부분이 for j 부분인데요 제 의도를 설명 드리자면 입력받은 허밍파일과 뮤직폴더 안의 첫번째 뮤직파일을 비교해서 puz[-1][-1]을 ppuz에 저장하고 (그럼 ppuz 안에 값이 하나씩 들어가겠죠?)
그 후 노래 한곡과 비교가 끝나면 ppuz 안에 값들 중 최소값 하나만 빼서 m_Val 에 저장하는겁니다 (따라서 print("m_Val:",m_Val) 은 노래 한곡과 비교가 끝날때마다 출력되는겁니다..
그 후 새로운 노래파일을 비교해서 ppuz를 채워야하기 때문에 ppuz를 클리어 해주고
다시 반복해서 노래파일 100개와의 비교가 끝나면 m_Val 에 저장된 값들을 오름차순으로 정렬하여
앞에서부터 5개의 [인덱스 번호 + 1] 을 순위에 맞게 출력하는 것입니다.
잘 이해가 되셨을지 모르겠지만, 이러한 의도를 가지고 코딩을 했는데 결과가 이상하게 나와 어디 이상한 부분이 있는지 질문을 하려고 합니다..
참고로 결과가 어떻게 나오냐면요..
노래 한곡과의 비교가 끝나야지 등장하는 m_Val 값이 노래 한곡이 아닌 비교 한번이 끝났을때 나와버립니다..
그리고 puz[-1][-1] 값도 자꾸 같은 값으로 나오는것 같긴 한데 그건 일단 그 후에 해결할 문제이구요..
좋은 답변 바랍니다!!
from math import * import numpy as np import os import pandas as pd def DTW(A, B, d=lambda x, y: abs(x - y)): # 비용 행렬 초기화 A, B = np.array(A), np.array(B) M, N = len(A), len(B) c = np.array([[0] * N for _ in range(M)]) c[0][0] = d(A[0], B[0]) # 첫번째 로우,컬럼 채우기 c[0][0] = d(A[0], B[0]) for i in range(1, M): c[i][0] = c[i-1][0] + d(A[i], B[0]) for j in range(1, N): c[0][j] = c[0][j-1] + d(A[0], B[j]) # 나머지 행렬 채우기 for i in range(1, M): for j in range(1,N): choices = c[i-1][j], c[i][j-1], c[i-1][j-1] c[i][j] = min(choices) + d(A[i], B[j]) return c h_file = open("C:\Fproject\humming_data\\" + input("허밍 파일 입력") + ".txt", "r", encoding = 'utf-8') h_list = [] for line in h_file : h_list.append(int(float(line))) h_file.close() dir="C:\Fproject\music_data\\" mf_list = [] m_Val = [] m_list=os.listdir(dir) A = h_list B = m_list for i in range(0,len(m_list)): #뮤직파일을 폴더 통째로 입력 받기위한 부분 m_file = open(dir +m_list[i], "r", encoding='utf-8') for line in m_file: mf_list.append(int(float(line))) ppuz = [] for j in range(0,(len(mf_list)-len(h_list)),10): #비교하는 부분 print("유사도") puz = DTW(np.array(h_list),np.array(mf_list[j: len(h_list) + j])) # DTW 호출 ppuz.append(puz[-1][-1]) #출력된 유사도 ppuz에 저장 print(puz[-1][-1]) print(ppuz) m_Val.append(min(ppuz))#ppuz에 저장된 값 중 최소값을 m_Val에 저장 print("m_Val :", m_Val) ppuz.clear() df_m_Val = pd.DataFrame(m_Val) print(df_m_Val) df_m_Val = df_m_Val.sort_values (by=0) print("유사도 1위는", df_m_Val.index[0]+1,"번째 노래") print("유사도 2위는", df_m_Val.index[1]+1,"번째 노래") print("유사도 3위는", df_m_Val.index[2]+1,"번째 노래") print("유사도 4위는", df_m_Val.index[3]+1,"번째 노래") print("유사도 5위는", df_m_Val.index[4]+1,"번째 노래")
작성자인데여.. 문제해결했는데 글 삭제가 안되네요?
작성자인데여.. 문제해결했는데 글 삭제가 안되네요?
유사한 문제를 겪는 다른 사람들이 나중에라도
유사한 문제를 겪는 다른 사람들이 나중에라도 참고하게끔
글을 삭제하기 보단 본인이 해결한 방법을 댓글로 남기는게 어떨까요.
----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라
댓글 달기