Pythonで宝くじを当てよう #4

今更だけどIDLEとNumPy

Pythonを扱うのにVSCODEを使ってきた。Debugの昨日も付いているし一々コマンドプロントとエディターの間を行き来する必要もないから。

しかし、PythonにはIDLEという開発環境がPythonと一緒にインストールされる。


このIDLEでもデバッグは可能だし、IDLEから実行も可能なので暫くIDLEを使ってみることにした。


IDLEの稼働状況は

こんな感じ。
VSCODEでPythonを使う場合色々設定が必要だが、IDLEの場合は一緒にインストールされ、何も設定は必要ないので、とりつきやすいかもしれない。
なにしろ、私もPythonは使い始めで知らないことが多い。

NumPyで配列

Pythonには数多くのライブラリが存在する。というよりむしろそのライブラリがあってこそのPythonといえるのかもしれない。
前回までに使用したcsvもライブラリのひとつである。

NumPyは大規模な多次元配列や行列をサポートし、かつ高速に行列演算ができる・・・というライブラリである、らしい。
前回はPythonは数値計算には向いてないようだと書いたが、大幅に前言撤回の必要がある。
NumPyの詳しいことはググって見てほしい。

前回までは

test_data = [[0]*m for i in range(n)]
result = [[0]*3 for i in range(maxn)]

のようにリストを利用して配列を構成していた。
resultには本来構造化配列を使用したいと思っていたが、それが無いので単に2次元配列で代替えしていた。
しかし、NumPyは2次元配列も構造化配列もサポートしている。

NumPyのインストール

csvは前回も使用しているライブラリだが、インストールせずに宣言することができたが、NumPyはpipを使ってインストールする必要がある。

コマンドプロンプトで

>pip install numpy

でインストールできる。

pipはPythonをインストールする際に、一緒にインストールされている。
配列の再定義は

import csv
import numpy as np

maxn = 43
n = 2000
m = 6

t_number = np.dtype([("score","f4"),("fre","i4",(3))])
test_data = np.zeros([n,m])
result = np.zeros(45,dtype = t_number)

t_number = np.dtype([(“score”,”f4″),(“fre”,”i4″,(3))])
は、構造体の定義、ということになるか。
score:後で評価値(浮動少数)、fre:出現回数3個の配列(整数)
の型の宣言
test_data = np.zeros([n,m])は、test_dataに2000×6の配列の確保。
result = np.zeros(45,dtype = t_number)は、t_numberの型で45個の配列を確保する。
リストを使った配列よりも少し考え方が複雑だが、後で計算や出力するときには逆に楽になる。
データの読み込み、出現回数の計算を含めたソースは

import csv
import numpy as np
maxn = 43
n = 2000
m = 6

t_number = np.dtype([("score","f4"),("fre","i4",(3))])
test_data = np.zeros([n,m])
result = np.zeros(45,dtype = t_number)

def dataload():
    with open('d:\ROTO_6\data.csv','r') as f:
        reader = csv.reader(f)
        i=0
        for row in reader:
            #print(row)
            j=0
            for data in row:
                if j > 0 :
                    test_data[i][j-1] = int(data)
                j = j+1
            i = i+1
        f.close()
        return i

def freq():
    for i in range(maxn):
        num = 0
        for j in range(numn):
            for k in range(6):
                n = test_data[j][k]
                if n == (i+1):
                    num+=1
                    #print(k,j,i+1)
        result["fre"][i][0] = num

numn = dataload()
for i in range(numn):
    v1 = test_data[i]
    print(i+1,v1)

freq()

for i in range(maxn):
    print(result["score"][i],result["fre"][i])

この中で、result[“fre”][i][0] = numは、resultの配列のi番目のデータのfre型の配列の0番目のデータを意味する。
普通の(C,C#,Delphi)言語をやっていると逆に分かりにくい(思うのだが)

そして、その結果は

====== RESTART: D:\ROTO_6\roto6(2).py ===
1 [ 2.  8. 10. 13. 27. 30.]
2 [ 1.  9. 16. 20. 21. 43.]
3 [ 1.  5. 15. 31. 36. 38.]
4 [16. 18. 26. 27. 34. 40.]
5 [ 9. 15. 21. 23. 27. 28.]
6 [ 6. 12. 23. 25. 28. 38.]
         .
         .
         .
1380 [ 1.  3. 24. 26. 29. 33.]
1381 [ 2.  4.  5. 16. 19. 38.]
1382 [ 8.  9. 12. 25. 26. 28.]
1383 [ 2.  4.  9. 15. 18. 39.]
1384 [ 3.  6. 13. 32. 38. 43.]   ここまでデータの確認
1 0.0 [185   0   0]
2 0.0 [198   0   0]
3 0.0 [197   0   0]
4 0.0 [192   0   0]
5 0.0 [192   0   0]
        .
        .
        .
40 0.0 [179   0   0]
41 0.0 [177   0   0]
42 0.0 [190   0   0]
43 0.0 [198   0   0]   score,[fre[0],fre[1],fre[2]]

開発環境も含めかなり後戻りになったが、これから後の作業が進めやすくなった。
と、いうことで

再スタート

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です