2015年10月18日日曜日

Pythonで文字列と数値を含んだテキストファイルの読み込み

こんなファイルを読みたい。 本当はnumpyのloadtxtでdtypeを指定する (or 読みたい列だけ読む) のが賢い気は果てしなくする。
data=map(lambda str:str.split(), open("FeDist_Screened.plt").readlines())
とはいえ、これはメンドくさすぎると感じるのは自分だけ?dtypeどうにかならんのか。 dtype=('f8','f8','S16')とかダメなのか...。
data=np.loadtxt('FeDist_Screened.plt', delimiter=' ', usecols=[0,2,11],skiprows=1,dtype={'names':('l','6.4','id'), 'formats':('f8','f8','S16')})
一応やりたかったことをやってみた結果。awkだと瞬間なんだけど...。
SCRIPT_TYPE="InstrumentalityOfMankind" 
SCRIPT_SHELL="python" 
SCRIPT_NAME="make_Data.py"
SCRIPT_HELP_ARG=""
SCRIPT_HELP_SENTENCE=""
SCRIPT_NUM_ARG=0
SCRIPT_VERSION=1.0

###IMPORT###

import sys


###HELP###

if len(sys.argv[1:])!=SCRIPT_NUM_ARG:
    print 'Name: '+SCRIPT_NAME
    print 'Arguments: '+SCRIPT_HELP_ARG
    print 'Explanation: '+SCRIPT_HELP_SENTENCE
    sys.exit()


###MAIN###

infile="FeDist_Screened.plt"

data=map(lambda str:str.split(), open("FeDist_Screened.plt","r").readlines())

f=1/(3.14*18**2)

enes=['6.4','6.7']
for ene in enes :
 if ene=="6.4" :
     line_num=2
 elif ene=="6.7" :
     line_num=5
 
 outname='Fe'+ene+'Dist_GRXE.txt'
 line_emin_num=line_num+1
 line_emax_num=line_num+2
 
 outfile=open(outname,"w")
 
 for data_row in data[1:] :
     if float(data_row[0])**2>10**2:
            l,b=data_row[0:2]
            ids=data_row[11]+' '+data_row[12]
                val, val_min, val_max=map(float,data_row[line_num:line_num+3]) 
                val=f*val
                val_err=f*(val_max-val_min)*0.5/1.64
                out_str=l+' '+b+' '+str(val)+' '+str(val_err)+' '+ids+'\n'
                outfile.write(out_str)

 outfile.close()
書き込む前にstrにするのとかが果てしなく面倒くさい。 結論 : awkで良いじゃん (ヲイ) or 適材適所。

2015年7月7日火曜日

N人のクラスで同じ誕生日の人がM人以上いる確率

学生さんのレポートでの質問に答えるために作った。40人クラスで3人以上同じ誕生日の確率は6.7%くらい。
###IMPORT###

import sys
import random

###MAIN###

def dice():
    return int(random.uniform(0,365))

def main():
    trial=1e5
    count=[]
    same=0
    N=40
    M=3
    
    for day in range(0,365) :
        count.append(0)
    
    for num1 in range(0,int(trial)):
        for day in range(0,365) :
            count[day]=0
    
        for num2 in range(0,N) :
            count[dice()]+=1
    
        for day in range(0,365) :
            if count[day] > (M-1) :
                same+=1
                break
        
    print same/trial

main()

2015年7月1日水曜日

篠本先生のじゃんけんマシン in Python

篠本先生の教科書で昔勉強したパーセプトロンのじゃんけんマシン (ソースはここを参照しました) をPythonで書き直してみた。 もし情報処理の授業を持つ事になったら、Pythonで機械学習とか面白いかと思ったのだが、ハードルが高い (&篠本先生の教科書は既に入手困難) か...。 GUIをつけてみたいところ。
###MAIN###
N=5

def perceptron(m,x,w,v):
    prec=[]
    
    if m<=0:
        return -1
                
    for k in range(0,3) :
        prec.append(-1)
        
    prec[m-1]=1
  
    for k in range(0,3):
            if prec[k]*v[k]<=0 :
                for j in range(0,3*N+1) :
                    w[(3*N+1)*k+j]+=prec[k]*x[j]
    
    for i in range(0,3*N-3) :
        x[3*N-1-i]=x[3*N-4-i]
        
    for i in range(0,3):
        x[i]=prec[i]

    for k in range(0,3):
        v[k]=0

    for k in range(0,3):
        for j in range(0,3*N+1):
            v[k]+=w[(3*N+1)*k+j]*x[j]
            
    vmax=-1000000
    for k in range(0,3) :
        if v[k] >=vmax :
            vmax=v[k]
            kmax=k
            
    return kmax+1
    
def main() :
    
    total=0
    v=[]
    fw=[]
    x=[]
    w=[]
    pred=0
    
    for i in range(0,3):
        v.append(0)
        fw.append(0)
        
    for i in range(0,3*N):
        x.append(0)
    x.append(-1)
    
    for i in range(0, 9*N+3):
        w.append(0)
    
    print "x:",x
    print "w:",w
    print "v:",v       
    m=1
    
    while m>0:
        pred=perceptron(m,x,w,v)

    
        while True:
            try:
                m = int(raw_input("1 Gu 2 Choki 3 Pa :"))
                break
            except ValueError:
                print "Try again..."    
        
        if m>3 :
            m=3
        
        print "You",m,"vs Machine",(pred+1)%3+1 
        if pred==m :
            print "Machine win."
            fw[0]+=1
        elif pred%3==m-1:
            print "You win"
            fw[1]+=1
        else:
            print "Draw"
            fw[2]+=1
            
        total+=1        
        print "You :",fw[1], "Machine:", fw[0], "Draw :",fw[2],"Total:", total
        #print "x:",x
        #print "w:",w
        #print "v:",v
     
    return 0

main()

2015年1月8日木曜日

ついカッとして作った

今は反省しています...。...辞書の使い方の練習、とか(汗)。
import random

def main():
    vals=['ST','CON','LK','DEX','IQ','CHR','SPD','MON']
    ch={}
    
    for val in vals:
        ch[val]=int(three_dices())
    
    bonus=cal_bonus(ch)
    print ch,bonus

def cal_bonus(ch) :
    vals=['ST','LK','DEX']
    bonus=0
    for val in vals :
        if ch[val]>12 :
            bonus=bonus+ch[val]-12
        elif ch[val]<9 :
            bonus=bonus+ch[val]-9

    return bonus

def dice():
    random.seed()
    return random.randint(1, 6)

def three_dices():
    s=0
    for num in [0,1,2]:
        s=s+dice()
    return s

main()