2016年1月30日土曜日

pythonのyield

「Dive Into Python 3」フィボナッチ数列ジェネレータ
http://diveintopython3-ja.rdy.jp/generators.html#a-fibonacci-generator

のyieldの処理が意味不明だった。。。

こちらの説明がわかりやすかった。
pythonのyieldにハマったから、初心者なりに解明してみた
http://aipacommander.hatenablog.jp/entry/2014/06/15/104756

yeild使えそう!

あとフィボナッチ数列とは(Wiki)

2016年1月25日月曜日

pythonで CSVファイルを読み込み、一列ごと空けてファイルへ書き込む

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# vim:fenc=utf-8

import csv

# 読み込みファイル
in_file = 't.csv'
fr = open(in_file, "r")
readcsv = csv.reader(fr)
data = [ v for v in readcsv ] # 読み込みCSVファイルデータをリストのリストで取得

col = len(data)       # 行
row = len(data[0])*2  # 列 # 変更後の列は (読み込みCSVファイルの列) x2のため"*2"

# 変更後の配列が入るオブジェクト
# 空の(col x row)配列を作成
cnv = []
for i in range(col):
   tmp = []
   for j in range(row):
       tmp.append('')
   cnv.append(tmp)

# すべて空列のcnvに2列ごとに読み込みCSVデータ列を入れる処理
for i in range(col):
    for j in range(row // 2):
        # 2 x jの列に jの列のdataデータを代入 
        cnv[i][2*j] = data[i][j]

# 書き込みファイル
fw = open('t-out.csv', 'w')
writer = csv.writer(fw, lineterminator='\n')
writer.writerows(cnv)
fw.close()

fr.close()

2016年1月23日土曜日

Pythonで画像認識にチャレンジのソースコード

「データサイエンティスト養成読本 機械学習入門編」
特集4 Pythonで画像認識にチャレンジ
第3章 リスト1 単純なパターンマッチング のコードがネット上になかったため、書いた。
https://github.com/tomoobata/ML_DS_Training/blob/master/ch3_1.py
ちなみに
ax2.add_patch(plt.Rectangle((y,x),tw,th, edgecolor='w', facecolor='none',linewidth=2.5))
という行が間違えていて次が正しいようだ。
rect = plt.Rectangle((y,x),tw,th, edgecolor='w', facecolor='none',linewidth=2.5)
あと第3章 リスト2のコードは、こちらの方が書かれていた。
http://mapodou.hatenablog.com/entry/2016/01/05/063000

感想:
しっかしもって処理に時間がかかる。
1枚の画像のマッチングに5,6秒とかやってられない。
デジカメやらスマホカメラのリアルタイムでの顔認識とかスマイル認識みたいなものは、まったく別のアルゴリズムなのか??と素朴な疑問。

>> 追記
顔認識アルゴリズムはいろいろ高速なものがあるようだが、それは置いておいて、OpenCVを入れて顔認識を試してみた。
https://github.com/tomoobata/ML_DS_Training/blob/master/cv.py
さすがにこれは速い。1秒掛からず顔認識した。すげー!

参照:
http://www.non-fiction.jp/2015/08/14/face-detect/
http://www.takunoko.com/blog/python%E3%81%A7%E9%81%8A%E3%82%93%E3%81%A7%E3%81%BF%E3%82%8B-part1-opencv%E3%81%A7%E9%A1%94%E8%AA%8D%E8%AD%98/

2016年1月22日金曜日

Python をWeb経由で実行させる方法

php のexec()関数を使って

< ?php
    $PythonPath =
      'python ./cgi-bin/test.py;
    exec($fullPath);
? >
とするのが手っ取り早くできた。
参照 http://freetech-e.com/html/callpython.htm

2016年1月17日日曜日

pythonでのコピー

python での値のコピー
a=b とやると値参照になるので注意!!
http://bugrammer.g.hatena.ne.jp/nisemono_san/20111210/1323444429
http://lightson.dip.jp/zope/ZWiki/084_e9_85_8d_e5_88_97_e3_82_92_e8_a4_87_e8_a3_bd_e3_81_99_e3_82_8b
pythonでの配列のコピー
   >>> import copy
   >>> e = copy.deepcopy(d)
   >>> b[0] = "b"
   >>> d
   (['a', 1, 2], ['b', 4, 5])
   >>> e
   (['a', 1, 2], [3, 4, 5])

pythonで転置行列にする(Numpyなし)

文字列を行列に含んでいるとNumpyでは面倒なので調べた。
data =
[['O', 'A', 'B', 'C', 'D', 'E', 'F'], 
 ['P', 'A11', 'A12', 'A13', 'A14', 'A15', 'A16'], 
 ['Q', 'A21', 'A22', 'A23', 'A24', 'A25', 'A26'], 
 ['R', 'A31', 'A32', 'A33', 'A34', 'A35', 'A36']]
のとき、

data2 = list(map(list, zip(*data)))
とするとできた。
data2 = 
[['O', 'P', 'Q', 'R'], 
 ['A', 'A11', 'A21', 'A31'], 
 ['B', 'A12', 'A22', 'A32'], 
 ['C', 'A13', 'A23', 'A33'], 
 ['D', 'A14', 'A24', 'A34'], 
 ['E', 'A15', 'A25', 'A35'], 
 ['F', 'A16', 'A26', 'A36']]

参照: http://asiagohan.hatenablog.com/entry/2015/05/08/170715
こちらのやり方もできた。
http://lightson.dip.jp/blog/seko/2830
def invert_lst(lst):
       col = len(lst[0])
       row = len(lst)
       inv = []
       for i in range(col):
               l = []
               for j in range(row):
                       l.append('')
               inv.append(l)                   
       for i in range(row):
               for j in range(col):
                       inv[j][i] = lst[i][j]
       return inv
       
lst = [[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]
print invert_lst(lst)

>>>[[1, 1, 1, 1, 1], [2, 2, 2, 2, 2], [3, 3, 3, 3, 3]]

pythonでループでのインデックス

pythonでループでのインデックス

>>> list1 = ['a', 'b', 'c']
>>> for (i, x) in enumerate(list1):
...   print i,x
... 
0 a
1 b
2 c