파이썬 코딩 질문있습니다!!

익명 사용자의 이미지

우선 소스코드에서 입력받는 파일은 모두 텍스트 파일입니다.
허밍파일은 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,"번째 노래")
익명 사용자의 이미지

작성자인데여.. 문제해결했는데 글 삭제가 안되네요?

나빌레라의 이미지

유사한 문제를 겪는 다른 사람들이 나중에라도 참고하게끔
글을 삭제하기 보단 본인이 해결한 방법을 댓글로 남기는게 어떨까요.

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.