【Pythonメモ】zip
zip
複数のシーケンスを並列的に反復処理が出来る。
list1 = [1, 2, 3] list2 = [4, 5, 6] for (a, b) in zip(list1, list2): #list1,list2を同時にループ … print(a,b)
>> list1 = [1, 2, 3] >> list2 = [4, 5, 6] for (a, b) in zip(list1, list2): print(a,b) 1 4 2 5 3 6
#シーケンスの要素数が異なる場合、要素数が少ない場合に合わせて挙動 >> list1 = [1, 2, 3,4] >> list2 = [4, 5, 6] for (a, b) in zip(list1, list2): print(a,b) 1 4 2 5 3 6
【Pythonメモ】enumerate OrderDicts nditer
enumerate
リストをインデックス化することができます。
>> list=["a","b","c","d","e"] >>> for index,val in enumerate(list): print(index,val) (0, 'a') (1, 'b') (2, 'c') (3, 'd') (4, 'e')
OrderDicts
ディクショナリとほぼ同じだが、順序が保存出来る。
>>> tests = OrderedDict() >>> tests['test1'] = '1' >>> tests['test2'] = '2' >>> tests['test3'] = '3' >>> print tests OrderedDict([('test1', '1'), ('test2', '2'), ('test3', '3')]) >>> for k, v in fruits.items(): print(k,v) ('test1', '1') ('test2', '1') ('test3', '2')
numpy nditer
nditerを用いると、繰り返し処理が楽なる
例えば、2×3行列なら以下のように×
import numpy as np np_array = np.random.randn(2,3) print(np_array) nditer = np.nditer(np_array, flags=['multi_index']) while not nditer.finished: print(np_array[nditer.multi_index]) nditer.iternext() [[-1.10258502 -1.390158 -1.3459963 ] [ 0.92886904 -0.2251729 0.23059408]] -1.10258502292 -1.39015799755 -1.3459963044 0.928869035018 -0.225172899317 0.230594077137
pythonのみで同じ処理を書くのは以下の通り
ネストしなくていい分、nditerを使ったほうが楽です。
for test in np_array: for t in test: print(t)
【pythonメモ】numpyメソッド randn max sum
random randn
標準正規分布を出力(標準0、分散1)
import numpy as np >>> np.random.randn() #-0.728737781876976 >>> np.random.randn(2,3) #2×3 array([[-0.01827125, -0.38984807, 0.08674773], [ 0.68593183, 0.82708901, -0.15050036]])
max
配列の中の最大値を出力
>>> np.random.randn(2).max() 2
sum(axis)
>>> np.array([1,2]).sum() 3
【Pythonメモ】numpyメソッド argmax
argmax
配列の中の最大値のインデックスを返すメソッドです。
>>> import numpy as np >>> test = np.array([1,2,5,40,20,30]) #配列は6個 >>> np.argmax(test) 3 #インデックスは0から数える >>> test2 = np.array([[1,2,3][10,20,30]]) #二次配列 >>> np.argmax(test2) #全要素の中から最大値を返す 5 ※軸を指定する時は第二引数にaxis=2といった形で指定 >>> test3 = [[1,2,5],[40,20,30],[10,20,30]] >>> np.argmax(test3,axis=1) #軸を1にしあt array([2, 0, 2]) >>> test4 =[[[1,2,5],[40,20,30],[10,20,30]],[[1,2,5],[40,20,30],[10,20,30]]] >>> np.argmax(test4,axis=2) #軸を2にした array([[2, 0, 2], [2, 0, 2]])
【Pythonメモ】numpyメソッド
メソッド調査
arange reshape linspace zeros_like ones_like zeros ones linspace
arange
np.arange([start,]stop, [step,])
一次元の配列を返す。 startが入っていない場合は0から始まる
import numpy as np np.arange(6) #初期値 start 0 step 1 #array([0, 1, 2, 3, 4, 5]) np.arange(1,3,0.1) # array([ 1. , 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2. , 2.1, # 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9])
zeros_like
配列の値をゼロにする。
np.zeros_like([[1,2,3],[2,3,4]]) #array([[0, 0, 0], # [0, 0, 0]])
ones_like
配列の値をイチにする。
np.ones_like([[1,2,3],[2,3,4]]) #array([[1, 1, 1], # [1, 1, 1]])
zeros
配列(行×縦)を作成、値はゼロ
np.zeros([3,2]) #array([[ 0., 0.], # [ 0., 0.], # [ 0., 0.]]) np.zeros((3,2)) #タプルも大丈夫
ones
配列(行×縦)を作成、値はイチ
np.ones([3,2]) #array([[ 1, 1], # [ 1, 1], # [ 1, 1]])
linspace
numpy.linspace(start, stop, num) 初期値(start)から終わり(stop)までを等間隔で配列を作成
np.linspace(0,1,5) #array([ 0. , 0.25, 0.5 , 0.75, 1. ])
flatten
多次元配列を一次元配列に変換
np.array([[1,2],[3,4],[5,6]]).flatten() #array([1, 2, 3, 4, 5, 6])
【Python】OpenCV2.4系 輪郭メソッド メモ
findContours(img,retrieval_mode,approx_mode)
画像の輪郭抽出に用いられます。
img:入力画像 retrieval_mode:抽出方法 approx_mode:近似モード
抽出方法について
わかりづらいのですが 輪郭が複数あった際の処理方法を示しています。 よく取り上げられるのはCV_RETR_LIST でしょうか。 この方法を設定すると、opencvが認識した輪郭全てを配列として返します。 ここを参照
近似モードについて
知覚した輪郭(点の集合)をどのように保存するか示しています。
代表的な近似モードは以下でしょうか。
CHAIN_APPROX_NONE (輪郭として抽出されたほぼ?)全ての点を保存します。 その他はわかりませーん\(^o^)/
drawContours(img, contours, -1,color,thickness)
検出した輪郭を描画します。
img:入力画像
contours:findContoursで抽出された輪郭(list形式)
第三引数:.全輪郭を描画する時はー1
【Python】OpenCV 初歩的メソッドメモ
はじめに
opencvを最近になって勉強しています。
備忘録として初歩的なメソッドをメモしておきます。
環境:Python 2.7.12 opencv 2.4.12
画像の読み込み
imread(読み込み画像パス)
色空間の変換
cvtColor(img,cv2.COLOR_BGR2GRAY)
COLOR_BGR2GRAY ・・・グレースケールにする
ウィンドウに画像を表示
imshow ・・・ウィンドウに画像を表示
# -*- coding: utf-8 -*- import cv2 img = imread("./test.jpg") gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #u'グレーに変換' cv2.imshow('image', img) #u'第一引数はウィンドウの名前、第二引数は画像データ' cv2.waitKey(0) #u'キーが押されるまで待機' if key == 27: cv2.destroyAllWindows()