【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

arange([start,]stop, [step,])

一次元の配列を返す。 startが入っていない場合は0から始まる

import numpy as np

arange(6) #初期値 start 0 step 1
#array([0, 1, 2, 3, 4, 5])

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()

【ネットワーク】リバースプロキシ、ロードバランサ

リバースプロキシとは

リバースプロキシとは、クライアント(ブラウザ)と webサーバー(nginx)の間にたって、代理で処理出来るものです。

リバースプロキシのメリットとしては、 クライアントとwebサーバーの間に挟まることで、様々な前後処理を施すことが出来ます。

IPアドレスのフィルタリングが出来ます。不明な大量アクセスを防ぐ際に重宝しそうですね。

例えば、不明な国からのアクセス(クライアント)に対してIPアドレスから判別して、アクセス拒否の処理が出来そうです。

※フィルタリングはwebサーバーでも対応出来そうですが、サーバーに 何個も役割をもたせるのは後々のことを考えると望ましくないと思います。

ロードバランサとは

複数のwebサーバーに処理を振り分けることが出来ます。

例えば、webサーバー複数ある場合、負荷を平準化するために用いられます。