i-vector를 추출하기위해 kaldi 라이브러리를 사용하던중 ark파일에 접근하는 방법을 설명한다.

 

kaldiio 의 load_ark

설치 : pip install kaldiio

from kaldiio import load_ark

with open("~.ark") as fd:
    for key, numpy_array in load_ark(fd):
        print(key, numpy_array)

key에는 utt-id, numpy_array에는 array값이 추출되는것을 확인할 수 있다.


이 라이브러리를 알기전에 open()으로 인코딩 값을 설정하여 추출하였는데

f= open("~.ark","r",encoding="utf-8")
t = f.read()
f.close()

인코딩이 안되는 경우가 있었다.

 

참고 : https://www.wenyanet.com/opensource/ko/607aa478cab8002036617fe4.html

원재의 사재기... 문제는 줄여서 쓰도록 하겠습니다.

    1. 원재는 연속된 N일 동안의 물건의 매매가를 예측하여 알고 있다.
    2. 당국의 감시망에 걸리지 않기 위해 하루에 최대 1만큼 구입할 수 있다.
    3. 판매는 얼마든지 할 수 있다.

 

입력3
3
10 7 6  # 가격이 점점 낮아져서 사지 않는 케이스
3
3 5 9   # 3, 5를 사고 9원일때 팔아서 총 9-3=6, 9-5=4 ,10의 이득을 챙김
5
1 1 3 1 2   # 1,1 을 3에 팔고 1을 2에 판다. 총 5의 이득

 

출력

#1 0
#2 10
#3 5

 

문제이해하는 단계부터 힘든건 뭐지.. 아무튼 위와같은 방식으로 코딩을 하고

  • 시간 : 10개 테스트케이스를 합쳐서 C++의 경우 30초 / Java의 경우 30초 / Python의 경우 30초
  • 메모리 : 힙, 정적 메모리 합쳐서 256MB 이내, 스택 메모리 1MB 이내

위의 조건을 통과 해야함..


T=int(input())
A=[]
for i in range(0,T):
    a = int(input())
    b = input().split()
    A.append(b)               #[[1번째 테스트 날짜별 금액],[두번째  테스트날짜별 금액]]
    

for l,i in enumerate(A):# 
    cnt=0
    for j in range(len(i)):
        if int(i[j]) < int(max(i[j:])): # 순차적으로 뒤에 있는 숫자중 제일 큰 값과 비교
            profit = int(max(i[j:]))-int(i[j]) 
            cnt += profit
    print(f"#{l+1} {cnt}")

 

위와 같이 코딩을 해서 직접 테스트 해보면 잘 되는데..

문제 제출을 하니 런타임 에러가 나오네요..ㅠ 아직 갈길이 멀었네


그래서 참지 못하고 정답자들의 코드를 보았다..

T=int(input())
for i in range(0,T):
    a = int(input())
    b = list(map(int,input().split()))
    money=0
    A = b[len(b)-1]
    for j in range(1,len(b)+1):
        if b[-j] < A:
            money = money + A-b[-j]
        else:
            A = b[-j]
    print(f'#{i+1} {money}')

라고 하네요.. 

메모리 영역 공부좀 더 해야겠다...

'개발공부 > Problem' 카테고리의 다른 글

프로그래머스 :: 가장 큰 수  (0) 2022.02.10
  • 머신러닝의 기본 흐름

1. 문제정의

   >> 어떤 문제에 머신러닝을 이용할 것인지 선택

 

2. 데이터수집 및 전처리

  >> 문제에 맞는 데이터 수집 및 결측치, 이상치 등 데이터 전처리

 

3. 모델 선택

  >> 데이터에 알맞은 머신러닝 모델 선택 보통 클래스의 개수, 데이터의 종류에 맞춰서 모델을 선택한다.

 

4. 학습

  >> 선택한 모델을 활용하여 학습

 

5. 평가

  >> 학습이 잘 되었는지 평가 Accuracy, F1-score, Recall, Precision 평가지표 활용

 

6. 고도화

  >> 고도화는 모델을 평가하고 결과가 좋지 않다면, 다시 데이터 전처리 과정으로 돌아가 다른 방법을 시도


Python 코드

import os
import pandas as pd
import numpy as np

from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, recall_score, precision_score, f1_score
from sklearn.metrics import classification_report, confusion_matrix

LR 참고 : [https://eunsukimme.github.io/ml/2019/10/22/Logistic-Regression/]

위 블로그에서 개념을 이해해보자..

 

문제 정의 및 데이터 수집, 전처리를 하고나면 데이터를 문제와 답, 학습과 훈련 셋으로 나눠준다.

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state=42)

train_test_split 함수를 사용하여 test_size를 0.2로 하여 데이터를 나눈다.

 * test_size : test의 비율을 정함

 * random_state : 데이터를 나누는 방법(번호를 지정하면 다시 해도 같은 데이터로 나눈다)

 

모델 선택 및 파라미터 설정

param = {"C":[0.001, 0.01, 0.1, 1, 10, 100, 1000],
         "solver" : ['newton-cg','lbfgs','liblinear','sag','saga']
        }

gs = GridSearchCV(LogisticRegression(),param_grid=param,cv=5,verbose=2,n_jobs=-1)
gs.fit(X_train,y_train)

lr_model = LogisticRegression(C=gs.best_params_["C"],max_iter=100,solver=gs.best_params_["solver"])
lr_model.fit(X_train,y_train)
predict = lr_model.predict(X_test)

GridSearchCV를 통해 파라미터를 찾는다. (모델과 모델에 들어갈 파라미터를 설정해서 넣어준다.)

 * n_jobs = -1 : cpu를 최대로 사용 (빠르게 하기위한 설정)

LR모델을 사용중인데 대부분 비슷하게 사용한다.

 

모델 평가

from sklearn.metrics import confusion_matrix
predict = lr_model.predict(X_test)
confusion_matrix(y_test,predict)

 [out] ( confusion_matrix )  [[TP, FN], [FP, TN]]

array([[ 0, 60],
       [ 0, 84]])

from sklearn.metrics import classification_report
print(classification_report(y_test,predict))

[out] ( 좋은 결과는 아니지만 .. 이런식으로 나온다..) 

              precision    recall  f1-score   support

           0       0.00      0.00      0.00        60
           1       0.58      1.00      0.74        84

    accuracy                           0.58       144
   macro avg       0.29      0.50      0.37       144
weighted avg       0.34      0.58      0.43       144

위와 같이 결과를 보고 좋은 결과가 아니면 다시 전처리 작업을 통해 성능을 좋게 해보자!

Pandas의 DataFrame을 확인할 때 다 보고싶은데 안보이는 경우가 있다.

import pandas as pd
pd.set_option('display.max_row', rows_num)
pd.set_option('display.max_columns', cols_num)

위 설정을 해주면 출력되는 데이터프레임 개수를 조절 할 수 있다.

rows_num, cols_num에 원하는 숫자를 넣는다.

 

 

주피터 노트북을 사용하면서 많은 함수를 사용하고 있는데,

 

가끔 파라미터에 뭐가 있는지 궁금한 경우가 있다.

 

그럴때 바로 함수의 설명을 볼 수있다.

바로 함수의 () 안에 커서를 두고 shift + tap 을 누르면 위 사진과 같이 함수의 설명이 나온다.

 

tqdm은 for문의 진행상황을 알 수 있다.

 

사용방법도 간단하다.

 

반복문의 in 뒤에 tqdm으로 감싸주면 끝

import numpy as np
from tqdm import tqdm

nums = np.arange(100) # 1~100 까지 array
total = 0
for num in tqdm(nums):
    total += num
print(total)

반복문 처리가 오래걸릴때 사용하면 진행 상황을 볼 수있어서 안 답답하다.

 

파이썬을 이용해서 폴더내의 모든 파일을 빠르게 이동, 복사, 파일명 변경하기


  • 파일 복사, 이동 :: shutil 라이브러리
import shutil
import os

# dir1 -> dir2 로 파일 Move
dir1 = "/파일 주소1/"
dir2 = "/파일 주소2/"

files = os.listdir(dir1) # dir1의 파일 목록을 list로 받는다.

for file in files:
    shutil.move(dir1 + file, dir2 + file) # 하나씩 순서대로 이동

shutil.copy 를 쓰게되면 파일을 복사할 수 있다.


  • 파일 삭제 :: os 라이브러리
import os

dir = "경로/폴더명"
files = os.listdir(dir)
for file in files:
	os.remove(dir+file,dir+"삭제할파일명")

  • 파일명 변경 :: os 라이브러리
import os

dir = "경로/폴더명"
files = os.listdir(dir)
for file in files:
	os.rename(dir+file,dir+"변경할파일명")

1. txt파일 읽기

fp = open("파일.txt","r", encoding='utf-8-sig') # 파일.txt를 읽는다.
text = fp.read() # txt 내용을 text변수에 담는다.

text변수에 내용을담아서 수정해서 다시 저장할 수 있다.

 

2. txt파일 저장

fp2 = open("new.txt",'w',encoding='utf-8-sig') # 빈 txt 파일 생성
fp2.write(text) # 빈 txt 파일에 내용 작성
fp2.close()

+ Recent posts