遊び手 2024年07月29日 カード111 いいね0

広告

単語カード

  • ファイルの読み込みとモード
    f = open('sample.txt','r') #ファイルを開く
    text = f.read() #内容を読み込む
    モード
    r:ファイルの読み込み
    w:ファイルへの上書き
    a:ファイルへの追記
  • ファイルを1行ずつ読み込む
    ファイルを閉じる
    f = open('sample.txt','r')
    for line in f:
    line = line.rstrip()
    f.close()
  • ファイルに書き込む
    f = open('sample.txt','w')
    f.write('new\n') #\nは改行コード
    f.close
  • ファイルに追記する
    f = open('sample.txt','a')
    f.write('new\n')
    f.close
  • withを用いてファイル処理
    with open('sample.txt','w') as f:
    f.write('new\n')
  • ファイルのエンコーディング
    f = open('test.txt','r',encoding='utf-8)
    text = f.read()
  • GUIプログラムのインポート
    import tkinter (as tk)
  • ウィンドウの表示
    タイトルの設定
    import tkinter as tk

    win = tk.Tk()

    win.title('title')
    win.minsize(320,240) #(x,y)

    win .mainloop()
  • tkオブジェクトのメソッド
    ウィンドウの破棄
    ウィンドウの幅と高さ、位置
    タイトルの左とタスクバーに表示されるアイコン
    サイズ変更が可能か
    destroy()
    geometry('幅*高さ+x+y')
    iconbitmap(ICO ファイル名)
    #ICOはウィンドウズで使用するアイコンの画像ファイル
    resizable(幅,高さ) #returnはTrue or Flase(True,False)
  • ラベルの配置
    import tkinter as tk

    win = tk.Tk()
    label. = tk.label(win,text = 'テスト',bg = 'white')
    label.place(x = 5,y=5)

    win.mainloop()
  • ボタンの配置
    import tkinter as tk

    def push():
    print('押された')

    win = tk.TK()
    btn = tk.Button(win,text='push',command = push)
    btn.place(x=0,y=0)

    win .mainloop()
  • 四角形を描画する
    "import tkinter as tk

    win = tk.TK()

    c = tk.Canvas(win,bg = 'lightgray')
    c.place(x = 0,y = 30)
    c.create_rectangle(10,10,60,60,fill = 'write') # 四角形を描画

    win .mainloop()"
  • 図形描画のメソッド
    直線
    楕円
    四角形
    多角形
    画像
    文字列を描画
    描画した図形の消去
    create_line(x1,y1,x2,y2,tag='タグ名')
    create_oval(x1,y1,x2,y2,tag='タグ名')
    create_rectangle(x1,y1,x2,y2,tag=''タグ名)
    create_polygon(x1,y1,x2,y2,x3,y3...,tag='タグ名')
    create_image(x,y,image='読み込んだ画像',tag='タグ名)
    create_text(x,y,text='文字列',fill='文字色',tag='')
    delete(削除したい図形のタグ)
  • チェックボックスの配置
    import tkinter as tk

    def check():
    print('犬',v1.get(),'猫',v2get())

    v1 = tk.BooleanVar()
    v2 = tk.BooleanVar()
    v1.set(False)
    v2.set(True)

    cb1 = tk.Checkbutton(win,text='犬',variable=v1)
    cb2 = tk.Checkbutton(win,text='犬',variable=v1)
    cb1.place(x=30,y=0)
    cb2.place(x=30,y=0)

    win = tk.TK()
    btn = tk.Button(win,text='push',command = check)
    btn.place(x=0,y=0)

    win .mainloop()
  • スライダを使う
    import tkinter as tk

    def size():
    print('slider:',v)

    win = tk.TK()

    s = tk.Scale(win,orient = 'h',command = size) # スライダの生成
    s.place(x=0,y=0)

    win .mainloop()
  • 1行入力
    import tkinter as tk

    win = tk.TK()

    e = tk.Entry(win,width=16)# エントリー部品の生成
    e.place(x=0,y=0)

    e.get() #エントリー部品の値を取り出す
    e.delete(0,tk.END) #エントリー部品を空にする

    win.mainloop()
  • bind
    e.bind('<Return>',draw) #Enterキーが押されたらdraw関数を実行する

    bindのイベント
    <Button-1>:左マススボタンが押された時
    <Button-3>:右マウスボタンが押された時
    <Double-Button-1>:左マウスボタンがダブルクリックされた時
    <Double-Button-3>:右マウスボタンがダブルクリックされた時
    <Enter>:マウスポインタがその部品に入った時
    <BackSpace>:BackSpaceが押された時
    <Tab>:tabが押された時
    <Left>,<Right>:左or右矢印が押された時
    <UP>,<Down>:上,下矢印が押された時
    <space>:スペースが押された時
    <Return>:エンターが押された時
    <Key>:なんらかのキーが押され時
  • イベントオブジェクトの変数
    def draw(event):

    wdget:イベントを受け取った部品
    x:マウスポインタのx座標
    y:マウスポインタのy座標
    char:押されたキーの文字
    keycode:押されたキーコード
    num:押されたマウスボタンの番号
    type:イベントの種類
  • テキスト部品
    import tkinter as tk
    import tkinter.scrolledtext as tkst

    win = tk.TK()
    t = tkst.text(win)
    t.place(x=0,y=0)

    f = open('sample.txt','r',encording='utf'-8')
    for line in f:
    t.insert(tk.END,line)

    #t.delete(index1,index2) :1~2までの文字列を削除
    #t.serch(text,index):index以降にtextで指定した文字列があるか探す

    win.mainloop()
  • メッセージボックス
    import tkinter as tk
    from tkinter import messagebox

    win = tk.TK()
    ret = messagebox.askyesno(title='確認',message='終了しますか?')
    if ret==True:
    win.destroy()#ウィンドウを破棄する

    win.mainloop()
  • グラフ描画ライブラリのインポート
    import matplotlib.pyplot as plt
  • 折れ線グラフを書く
    import matplotlib.pyplot as plt

    data = [6,3.1,4.5,2.4,5,7,4,8]
    plt.plot(data)
    plt.show()
  • マーカ
    plt.plot(data,marker='o')

    o:circle
    x:x
    D:diamond
    +:+
    .:point
    s:square
  • グリッドの追加
    plt.grid(True)
  • ラベルとタイトル
    plt.title('タイトル')
    plt.xlabel('横軸')
    plt.ylabel('縦軸')
  • 複数のデータを一つに描画
    import matplotlib.pyplot as plt

    x = [10,20,30,40,50]
    y1 = [1.20,1.61,1.54,1.57,1.69]
    y2 = [1.25,1.37,1.28,1.21,1.19]
    y3 = [1.22,1.60,1.18,1.13,1.08]

    plt.plot(x,y1)
    plt.plot(x,y2)
    plt.plot(x,y3)

    plt.show()
  • 色の指定をする
    汎用を指定する
    plt.plot(data,marker='o',color='red')
    color='blue','green'

    plt.legemd(loc='upper left')
    upper left
    center center
    lower lower
  • 線種を指定する
    plt.plot(data,marker='o',color='red',linestyle = '--')
    --:実践
    -:破線
    -.:1点破線
    ::点線
  • 散布図
    plt.scatter(x1,y1,marker='o',color='red')
    plt.scatter(x2,y2,marker='^',color='blue')
  • 縦棒グラフ
    横棒グラフ
    積み上げ棒グラフ
    plt.bar(x,data)
    plt.barh(x,data)
    plt.bar(x,data,bottom=dat1+data2,color='orange')
  • 複数グラフを並べて表示
    plt.subplot(1,2,1) #1行2列で表示し、1つ目という意味
    plt.plot(x,data1)
    plt.subplot(1,2,2) #1行2列で表示し、1つ目という意味
    plt.plot(x,data2)
  • スクレイピングのライブラリ
    pip install beautifulsoup4
    import bs4
  • スクレイピング<li>
    import bs4

    html = open('index.html','r',encoding='utf-8')
    soup = bs4.BeautifulSoup(html,'html.perser')
    li = soup.find_all('li')

    print(li)
  • スクレイピング文字列だけ取り出す
    import bs4

    html = open('index.html','r',encoding='utf-8')
    soup = bs4.BeautifulSoup(html,'html.perser')
    list = []
    for li in soup.find_all(li):
    list.append(li.string)

    print(li)
  • 入れ子要素の取得
    import bs4

    html = open('index.html','r',encoding = 'utf-8')
    soup = bs4.BeautifulSoup(html,'html.perser')
    list = []
    for ol in soup.find_all('ol'):
    for li in ol.find_all('li'):
    list.append(li.string)
    print(list)
  • 条件を指定して要素を取得する
    import bs4

    html = open('index.html','r',encoding = 'utf-8')
    soup = bs4.BeautifulSoup(html,'html.perser')
    list = []
    for ol in soup.find_all('ol',class_ = 'dessert'):
    for li in ol.find_all('li'):
    list.append(li.string)
    print(list)
  • URLにアクセスしてHTMLを取得する
    import bs4
    import requests #HTTP通信
    import time

    URL = 'http://www.otsuma.ac.jp/news'
    r = requests.get(URL)
    s = bs4.BeautifulSoup(r.content,'html.perser')
    list = []
    for i in s.find_all('span',class_ = 'sub'):
    list.append(i.string)
    time.sleep(3600) # 3600秒待機
    print(list)
  • 複数ページにアクセスする
    import bs4
    import requests #HTTP通信
    import time

    URL = 'http://example.com/news/page'
    for count in range(1,10):
    r = requests.get(URL+str(count))
    s = bs4.BeautifulSoup(r.content,'html.perser')
    list = []
    for i in s.find_all('span',class_ = 'sub'):
    list.append(i.string)
    time.sleep(3600) # 3600秒待機
    time.sleep(5)
    print(list)
  • データベースのimport
    基本パターン
    import sqlite3

    con = sqlite3.connect('data.db') #データベースに接続する
    c = con.cursor() #Cursor帯ジェクトを作成する
    sql = 'SELECT * FROM users'
    c.execute(sql)
    con.commit()
    con.close()
  • SQLの基本命令
    CREATE:テーブルの作成
    INSERT:テーブルへのデータの登録や挿入
    SELECT:データの検索・表示
    UPDATE:データの更新
    DELETE:データの削除
  • テーブルの作成プログラム
    import sqlite3

    con = sqlite3.connect('data.db')
    c = con.cursor()
    sql = 'CREATE TABLE users(id INTEGER,name TEXT)'
    c.execute(sql)
    con.commite()
    con.close()
  • テーブルの作成
    メソッド
    CREATE TABLE テーブル名(カラム名 データ型,...)
    INTEGER:整数
    NUMERIC:整数または小数
    REAL:小数
    TEXT:テキスト
    BLOB:バイナリーデータ(画像,動画など)を格納

    データベース名/data.db
    テーブル名/uses
    カラム名/id:INTEGER型
    カラム名/name:TEXT型
  • データの挿入
    INSERT INTO テーブル名(カラム1,カラム2,...) VALUES(値1,値2,...)
    sql = 'INSERT INTO users(id, name) VALUES(1,"おおつま")'
    c.execute(sql)
  • データの検索
    SELECT 取得するカラム名 FROM テーブル名
    sql = 'SELECT * FROM users'
    for row in c.execute(sql):
    print(row)
  • 検索の条件を指定する
    SELECT * FROM users WHERE id = 1
    id >= 3
    =:等しい
    <>:等しくない
    >:より大きい
    >=:以上
    <:より小さい
    <=:以下
    AND,OR演算子
  • あいまい検索
    SELECT * FROM users WHERE name LIKE 'お%'
    nameカラムの値が「お」で始まるデータが抽出
    %き%:中間にきがある
  • 結果表示をソートする
    SELECT * FROM users ORDER BY id DESC #降順,高い→小さい
  • 結果表示件数を制限する
    SELECT * FROM users LIMIT 3
  • データの更新
    UPDATE テーブル名 SET 更新データ WHERE 条件
    sql = 'UPDATE users SET name ="さやま" WHERE id = 2'
    c.execute(sql)
  • データの削除
    DELETE FROM テーブル名 WHERE 条件
    sql = 'DELETE FROM users WHERE id = 3'
  • 自然言語処理を使えるようにする
    pip install janome
    from janome.tokenizer import Tokenizer
  • 形態素解析をする
    from janome.tokenizer import Tokenizer

    t = Tokenizer()
    tokens = t.tokenize('私の名前は真梨子です')
    for token in tokens:
    print(token)
  • 形態素解析の変数7
    surface:表層系
    part_of_speech:品詞
    infl_type:活用型
    infl_form:活用形
    base_fprm:基本形
    reading:読み:読み
    phonetic:発音:発音
  • listの結果
    from janome.tokenizer import Tokenizer

    t = Tokenizer()
    tokens = t.tokenize('私の名前は真梨子です')

    print(list(tokens))

    結果
    ['私','の','名前','は','真梨子','です']
  • 単語の出現回数を数える
    from janome.tokenizer import Tokenizer

    t = Tokenizer()
    tokens = t.tokenize('私の名前は真梨子です')

    count = 0
    for token in tokens:
    pos = token.part_of_serch
    pos = pos.split(',')x
    if pos[0] == '名詞':
    print(token)
  • 単語の出現回数を数える
    analyzer
    from janome.tokenizer import Tokenizer

    t = Tokenizer()
    text = '私の名前は真梨子です'

    tf = [POSKeepFilter('名詞'),TokenCountFilter()]
    a = Analyzer(token_filters = tf)
    results = a.analyze(text)

    for w,c in results: #フィルターを通過した単語と個数
    print(w,c)
  • 単語の出現回数を数える
    from janome.tokenizer import Tokenizer

    f = open('test.txt','r',encoding = 'shift_jis')
    text = f.read

    tf = [POSKeepFilter('名詞'),TokenCountFilter()]
    a = Analyzer(token_filters = tf)
    results = a.analyze(text)

    s = sorted(results,key=lambda x:x[1],reverse = True)
    for i,wc in enumerate(s): #フィルターを通過した単語と個数
    print((i+1),':' ,wc)
  • HTMLからタグを外す,ユーザー辞書,フィルタの作り方
    飛ばす
  • クライアントサーバモデル
    クライアントプログラム:サーバプログラムが提供するサービスを利用する人(ユーザ)が使うプログラム
    サーバプログラム:ユーザが利用するサービスを提供するプログラム
  • クライアントサーバモデルのメリットデメリット
    各クライアントプログラムは自分以外のプログラムがどこで動いているか知る必要がない
    クライアントプログラムを管理しやすい
    サーバが停止しすると全システムが停止してしまう
    サーバへ処理が集中するためシステム負荷が高くなる
  • 相手の指定方法
    IPアドレスで指定
    windows:ipcongifコマンド→IPv4アドレス:IPアドレス
  • ポート番号
    プログラムがサーバで2つ動いているときにクライアント側がどちらのプログラムにアクセスするかを指定するための番号
  • プログラムの基本パターン
    クライアント
    ライブラリのインポート
    サーバプログラムと通信用のsocketを用意
    IPアドレスとポート番号を指定する
    サーバにデータを送信、サーバからデータの受信
  • プログラムの基本パターン
    サーバ
    必要なプログラムをインポートする
    クライアントと通信用のsocketを用意
    自分のポート番号を登録
    1度に接続できるクライアントの数を設定
    クライアントの接続を受ける
    クライアントにデータの送受信をする
  • クライアントの最も短いプログラム
    import socket

    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.connect(('127.0.0.1',5555))
    msg = input('メッセージ: ')
    s.send(bytes(msg,encoding='utf-8'))
    data = s.recv(1024)
    print('server: ',str(data,encoding='utf-8'))
  • アドレスファミリーとソケットタイプ
    AF_LOCAL:同一コンピュータ内の通信
    AF_INET:インターネットプロトコルIPv4による別のコンピュータ間での通信
    AF_INET6:インターネットプロトコルIPv6による別のコンピュータ間での通信

    SOCK_STREAM:ストリーム型通信。順序と信頼性のある接続型(電話みたいな)の通信方式。低速
    SOCK_DGRAM:データグラム型の通信。順序と信頼性のない非接続型(手紙みたいな)の通信方式。高速
  • サーバのプログラム
    import socket

    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    print('server start')
    s.bind(('',5555))
    s.listen(10)
    c,addr = s.accept()
    print('connected')
    data = c.recv(1024)
    print('client: ',str(data,encoding='utf-8'))
    c.send(bytes('メッセージを受け取りました',encoding='utf-8'))
    s.close()
  • 複数のクライアントと何度も通信できるようにする
    エコーサーバ
    #エコーサーバ
    import socket

    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.bind(('',5555))
    s.listen(10)
    c,addr = s.accept()
    while True:
    data = c.recv(1024)
    c.send(data)

    #クライアント
    import socket

    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.connect(('127.0.0.1',5555))
    while True:
    msg = input('メッセージ: ')
    s.send(bytes(msg,encoding='utf-8'))
    data = s.recv(1024)
    print('server: ',str(data,ecoding='utf-8'))
    print('server: ',str(data,encoding='utf-8'))
  • セレクト処理
    import socket
    import select

    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.bind(('',5555))
    s.listen(10)
    socks = [svr]

    while True:
    r,w,x = select.select(sockes,[],[])
    for s in r:
    if s is svr:
    c,addr = svr.accept()
    socks.append(c)
    else:
    msg = s.recv(1024)
    if len(msg) != 0:
    print(str(msg,encoding='utf-8'))
    s.send(msg)
    else:
    socks.remove(s)
    s.close()
  • チャットプログラムを製作する
    サーバ
    import socket
    import select

    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.bind(('',5555))
    s.listen(10)
    socks = [svr]

    while True:
    r,w,x = select.select(sockes,[],[])
    for s in r:
    if s is svr:
    c,addr = svr.accept()
    socks.append(c)
    else:
    msg = s.recv(1024)
    txt = str(msg,encoding='utf-8')
    if txt != 'bye':
    for c in socks:
    if c is not svr:
    c.send(msg)
    else:
    print('切断要求')
    s.send(msg)
    socks.remove(s)
    s.close()
  • チャットプログラム
    クライアント
    終了処理
  • webアプリケーション
    Django
    pip install django
  • Djangoプロジェクトを作成する
    > django-admin startproject mysite
    >cd mysite
    >python manage.py migrate
    >python manage.py runserver
  • 設定ファイルの変更
    mysite/settings.py
    106 LANGUAGE_CODE = 'ja'

    109 TIME_ZONE = 'Asia/Tokyo'
  • Djangoアプリケーションを作成する
    >cd ...mysite
    >django-admin startapp hello

    mtsite/settings.py
    34 INSTALLED_APPS = [
    'hello', #追加する

    hello/views.py に下記を追加
    from django.http.response import HttpResponse

    def hello_world(request):
    return HttpResponse('<H1>こんにちは!</H1>')
    mysite/urls.py に下記を追加
    17 from django.urls import path, include

    urlpatterns = [
    path('admin/',admin.siteurls),
    path('hello/',include('hello.urls')),
    ]

    hello/urls.pyを作成
    from django.urls import path
    from . import views

    urlpatterns = [
    path('',views.hello_world),
    ]
  • 動作確認
    >python manage.py runserver
  • テンプレートを使う
    hello/templates/hello/ここにhtmlファイルを作成(index.html)
    index.html:テンプレート特有の操作
    <h1>{{text}}</h1>
    今日のラッキーナンバーは{{num}}です

    hello/views.py
    ここでtextとnumの数値を設定
    下記を追加
    def index(request):
    params = {'text':'これがテンプレートです',
    'num':random.randint(1,10)}
    return render(request,'hello/index.html',parms)

    hello/urls.py
    urlpatterns = [
    path('',views.hello_world),
    path('index',views.index),
    ]
  • テンプレートでif
    html文
    {% if age >= 20}
    {{age}}歳:お酒は大丈夫です!
    {% else %}
    {{age}}歳:お酒は20歳になってから
    {% endif %}


    {% タグ名 引数 %}
    or
    {% タグ名 引数 %}
    :
    :
    {% endタグ名 %}
  • 静的ファイル
    html文
    {% load static %}
    ...
    <img src="{% static 'hello/sky.png' %} alt="表示できません">
    ...
    <img src="{% static pic %} alt="表示できません">の場合

    hello/views.py
    def png(request):
    params = {'pic':'hello/sky.png',
    return render(request,'hello/png.html',parms)
  • 入力されたデータを処理する
    form.html
    ...
    <form action="" method="post">
    {% csrf_token % }
    {{form}}
    <input type="submit" value="送信">
    </form>
    <p>{{result}}</p>
    ...
    hello/forms.py#作成
    from django import forms

    class HelloForm(forms.Form):
    name = formsCharField(label = '名前')
    age = fofrms.InteferField(label = '年齢')

    hello/views.py #追加する分だけを書く
    ...
    from .forms import HelloForm
    ...
    def form(request):
    parms = {'form':None,'result':''}
    if(request.method != 'POST')
    parms['form'] = HelloForm()
    parms['result'] = '入力された名前,年齢を表示'
    else:
    parms['form'] = HelloForm(request.POST)
    parms['result'] = '名前:' + request.POST['name'] + ', ' + request.POST['age']
    return render(request,'hello/form.html',parms)

    hello/urls,py
    ...
    urlpatterns = [
    path('form',views.form)
    ]
  • 数値計算ライブラリ
    Numpy
    pip install numpy
  • 行列の作り方
    import numpy as np

    a = np.array([1,2,3]) #((1,2,3))でも可
    print(a[0],a[-1]) #1 3
    print(a[a >= 2]) # [2 3]
    print(a[a % 2 == 0]) #2

    a = np.array([[1,2,3],[4,5,6]])
    a[0][0]
  • 部分配列へのアクセス
    a = np.array([1,2,3,4,5,6])
    print(a[3:6]) # 4 5 6
    print(a[::3]) # 1 4
    print(a[::-1]) # 6 5 4 3 2 1
  • 加減、スカラー倍、乗除算
    a = np.array([1,2,3])
    b = np.array([4,5,6])
    print(a + b) # 5 7 9
    print(a - b) # -3 -3 -3
    print(a * 2) # 2 4 6
    a / 2 0.5 1 1.5
    a * b #4 10 18
    a / b #0.25 0.4 0.5
  • 加減、スカラー倍、乗除算
    2列
    a = np.array([[1,2],[3,4]])
    b = np.array([[5,6],[7,8]])

    a+b = [[6 8] [10 12] ]
    a-b = [[-4 -4] [-4 -4]]
    a*b = [[5 12] [21 32]]
    a/b = [[0.2 0.333..] [0.4285 0.5]]
  • 内積、行列同士の積
    行列の計算は[サイズ]の一致
    (行*列)= (m*a) * (a*n)
    aの位置が一致していないと計算できない
  • ベクトルの外積
    a = np.array([1,2,3])
    b = np.array([4,5,6])
    np.linalg.norm(a) #ノルム
    np.cross(a,b) #外積
  • numpy配列の置換
    a = np.array([1,2,3,4,5,6])
    a = v.reshape(2.3) # 2行3列の行列へ
    a # [[1,2,3],[4,5,6]]
  • 型変換
    a = np.array([1,2,3],dtype=no.float32)
    a #1.2.3.

    データ型
    int8:符号あり8ビット整数型
    int16:符号あり16ビット整数型
    int32:符号あり32ビット整数型
    int64:符号あり64ビット整数型
    uint8:符号なし8ビット整数型
    uint16:符号なし16ビット整数型
    uint32:符号なし32ビット整数型
    uint64:符号なし64ビット整数型
    float16:半精度浮動小数点型
    float32:単精度浮動小数点型
    float64:倍精度浮動小数点型
    bool:ブール型,True or False
  • csvファイルの読み込み
    a = np.loadtxt('sample.txt',delimiter=',')
  • 連立一次法的式の解法
    ax + by = c
    dx + ey = f

    ([[a,b],[d,e]]) * ([x,y]) = ([c,f])
    A = np.array([[a,b],[d,e]])
    v = np.array([x,y])
    if np.linalg.det(A) !=0: #0ではないのでAは逆行列を持つ
    B=np.linalg.inv(A)
    print(np.dot(B,v)) #行列*行列
    else:
    print('解は存在しません')
  • Numpyの関数リスト
    np.astype(a,dtype=型):aの要素の型を指定した方に変更する
    np.append(a,b,axis = n):Numpy配列aにリストbを追加する命令。n=0を指定すると行に,n=1を指定するとれつに追加される
    np.insert(a,m,b,axis=n):Numpy配列aのm成分目にリストbを挿入する.axisの働きはappendと同じ
    np.delete(a,m,axis=n):Numpy配列aのm成分目の値を削除するaxisの働きはappendと同じ
    a.sum(n):n=0なら各列の合計,n=1は各行の合計
    a.max(n):n=0なら各列の最大,n=1は各行の最大
    a.min(n):n=0なら各列の最小,n=1は各行の合計
    a.mean(n):n=0なら各列の平均,n=1は各行の平均
    np.arrange(n,m,k,dtype=型):nから始まり,kずつ増え、m未満までの数列を成分に持つNumpy配列を生成する
    np.linspace(n,m,k,dtype=型):nから始まり,kずつ増え、m分割して得られる数列を成分に持つNumpy配列を生成する
    np.empty((n,m),dtype=型):全成分が0である、サイズ(n,m)のNumpy配列を生成する。
    np.zeros((n,m),dtype=型):全成分が0である、サイズ(n,m)のNumpy配列を生成する。
    np.ones((n,m),dtype=型):全成分が1である、サイズ(n,m)のNumpy配列を生成する。
    np.identity(n,dtype=型):体格成分が1である、サイズ(n,n)のNumpy配列(単位行列)を生成する
    np.eye(n,dtype=型):identityと同様
    np.loadtxt('ファイル名',delimiter='',dtype=型):指定したファイル名のファイルを読み込み,Numpy配列を生成する
    np.where(x>10):Numpy配列xに対し徐見識を満たす成分の添え字を戻す
    np.where(x>10,y,z):Numpy配列に対する条件式(x>10)に対し、条件式を満たす添え字の成分をy,条件式を満たさない成分をzと置き換える
  • 画像処理ライブラリ
    pip install opencv-python
    pip install opencv-contrib-python
  • 画像を表示する
    import cv2

    img = cv2.imread('sky.png')
    cv2.imshow('image',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
  • ネガポジ反転
    import cv2

    img = cv2.imread('sky.png')
    img = 255 - img
    cv2.imshow('image',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
  • ピクセルの値を調べる
    import cv2

    img = cv2.imread('sky.png')
    c = img[5,10]
    print('BGR: ',c[0],c[1],c[2]) #BGR順であることに注意
    cv2.imshow('image',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
  • グレースケール化する
    import cv2

    img = cv2.imread('sky.png')
    height,width,d = img.shape #高さ,幅、深さ

    for y in range(height):
    for x in range(weight):
    c = img[y,x]
    gray = 0.3 * c[2] + 0.59 * c[1] + 0.11 * c[0]
    img[y,x] = [gray.gray,gray]

    #関数を使う場合
    #gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

    cv2.imshow('image',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
  • 二値化処理
    画像の色を0(黒)と1(白/255)の2段階に変化する
    import cv2

    img = cv2.imread('sky.png')
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    r,b = cv2.threshold(gray,90,255,cv2.THRESH_BINARY) #閾値が90以上のものを255
    #r,b = cv2.threshold(gray,0,cv2.THRESH_OTSU)#閾値が自動的に計算される

    cv2.imshow('image',b)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
  • フィルタ処理
    畳み込み演算:線形フィルタ

    filter = np.array([[1/9,1/9,1/9],
    [1/9,1/9,1/9],
    [1/9,1/9,1/9]])
    dst = cv2.filter2D(img,-1,filter)
    cv2.imshow('image'dst)
  • 平滑化フィルタ
    dst = cv2.blur(img,(3,3)) #平滑化フィルタ 3*3
    dst = cv2.medianBlur(img,3) #メディアンフィルタ処理(3*3)
    dst = cv2.Canny(img,thresholdl=90,threshold2=110) #エッジの抽出 微分処理
  • 物体検出
    テンプレートマッチング
    import numpy as np

    r = cv2.matchTemplate(target,temp,cv2.TM_CCOEFF_NORMED)
    loc = np.where(r >= 0.85) #結果から類似度の高い位置を取得

    for top_left in zip(*loc[::-1]):
    bottom_right=(top_left[0] + temp.shape[1],top_left[1] + temp.shape[0] #右下の座標
    cv2.rectangle(target,top_left,bottom_right,(0,0,255),2)
  • 特徴点を用いた物体検出
    d = cv2.AKAZE_create()
    kpI,desI = d.detectANDCompute(img,None)
    kpT,desT = d.detectAndCompute(target,None)
    bf = cv2.BFMatcher()
    matches = bf.natch(desI,desT)
  • 顔検出
    cas = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_alt.xml')
    faces = cas.detctMultiScale(img,minSize=(100,100))

  • 動画の表示
    import cv2

    v = cv2.VideoCapture('ball.mp4')
    while True:
    ret,frame = v.read()
    if ret == False: break
    cv2.imshow('image',frame)
    if cv2.waitKey(10)==27: break
    v.release()
    cv2.destroyAllWindows()
  • 動物体検出
    import cv2

    back = cv2.imread('background.png')
    back = cv2.cvtColor(back,cv2.COLOR_BGR2GRAY)
    v = cv2.VideoCapture('ball.mp4')
    while True:
    ret,frame = v.read()
    if ret == False: break
    frame = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    diff = cv2.absdiff(frame,back)
    cv2.imshow('image',frame)
    if cv2.waitKey(10)==27: break
    v.release()
    cv2.destroyAllWindows()
  • 機械学習ライブラリ
    畳み込みニューラルネットワーク
    pip install scikit-learn
    pip install tensorflow
    pip install keras
  • 学習
    #学習器の作成
    mlp = MLPClassifier(hidden_layer_sizers=(128,),activation='relu',verbose=True)
    #訓練データで学習
    mlp.fit(x_train,y_train)
    #モデルの保存
    joblib.dump(mlp,'model.pkl',compress = True)
    #モデルのロード
    mlp = joblib.load('model.pkl)
    #予測
    mlp.predict([a])
  • モデルの定義
    model = Sequential()#モデルの構築
    model.add(Dense(128,input_shape=(28*28,),activation='relu')) #層の追加
    #model.add(Dense(128,activation='relu')) # 層をさらに追加
    model.add(Dense(10,activation='softmax')) #出力層
    model.summary() #モデルの表示

    model.save('model_test') #モデルの保存
  • 過学習とドロップアウト
    ドロップアウト(結合をランダムに断つこと)で過学習の抑制ができる
    model = Sequential()#モデルの構築
    model.add(Dense(128,input_shape=(28*28,),activation='relu')) #層の追加
    model.add(Dropout(0.3)) # ドロップアウト
    model.add(Dense(10,activation='softmax')) #出力層
  • 畳み込みニューラルネットワークのモデルの定義
    model = Sequential() #モデルの作成
    model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1))) #畳み込み層:線形フィルター
    model.add(MaxPooling2D(pool_size=(2,2))) #プーリング層:情報の圧縮:ある範囲から平均、最大のものを取り出す
    model.add(Flatten()) #全結合層に渡すための1次元化
    model.add(Dense(128,activation='relu')) #全結合層
    model.add(Dense(10,activation='softmax')) #出力層
  • ファインチューニング
    学習済みのモデルの持つパラメータの一部だけを学習しなおす
広告

コメント