仮想空間VR:Unity2018 C# arrayの書き方

こんにちは、(; ・д・´) かず まなぶ です。

array(配列) をやっていきましょう。

  • arrayは   {    ,      ,      ,     } で表現できる。
  • 1.0fを頭に掛け算すると少数を表現できる。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test_array : MonoBehaviour {
// Use this for initialization
void Start () {
//整数型arrayを5つ新規作成(new)
int[] array = new int[5];
array[0] = 0;//数値を代入
array[1] = 10;
array[2] = 20;
array[3] = 30;
array[4] = 40;
for (int i = 0; i < 5; i++)
{
Debug.Log(array[i]);
}
//配列初期化の簡易記法を使ってみる
int[] array2 = { 0, 100, 200, 300, 400 };//配列の数は解るのでnewは要らない
for (int i = 0; i<array2.Length ; i++)//.Lengthで配列の長さを調べる
{
if (array[i] > 150)
{
Debug.Log(array[i]);
}
}
//例題:平均を計算してみよう
int[] array3 = { 45, 59, 18, 67, 62, 89, 48, 32 };
int sum = 0;
for (int cnt = 0 ; cnt<array3.Length ; cnt+=1)
{
sum += array3[cnt];
}
Debug.Log(1.0f*sum / array3.Length);//1.0fを頭に掛け算することによって少数点が表現できる。裏技的だけど超重要!
}
// Update is called once per frame
void Update () {
}
}

次回は、メソドとクラス やっていきましょう。

とにかく、一気にC#の基本は終わらせたいので 突っ走りますよ(; ・д・´)

仮想空間VR:Unity2018 C# if構文とfor構文

こんにちは かず まなぶ です。

今日は、if と for やりましたので、貼っておきます。

はまりどころ

  1. C#のファイル名を変更したら、クラス名をそのファイル名と同じ名称に変更しなければ動かない。 例)ファイル名をTest.csにしたら、public class Test : MonoBehaviourにしなければならない。
  2. ifとかforの後ろはセミコロンをつけない。
  3. ifとかforでネストする内容は、{ }でくくらなければならない。
  4. elifは存在しなくて else if と書くこと。
  5. elseは、そのほか、以下も実行します。という意味であり、ifでも else ifでもなかったらそのほかの処理として実行します、ではないので注意!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour {
// Use this for initialization
void Start () {
//if , else if , else構文を使ってみる
int value1 = 180;
if (value1 > 100)//条件式は( )でくくります。 セミコロンはつけません。
{
Debug.Log("value1は100を超えています!");
}
else if (value1 < 100)//else if です。 elifではありません。
{
Debug.Log("value1は100未満です( ゚Д゚)");
}
else;//そのほか、以下も実行します。※ifでも else ifでもなかったら実行します、ではないので注意!
{
Debug.Log("value1は100ドンピシャです!");
}
//for構文を使ってみる
for ( int i= 0 ; i < 10; i += 2)// iを int型として定義する、初期値i=0, i<10の条件まで繰り返す , iに2を足して次の繰り返しへ
// i+=2の部分は i++ とか i-- も使える
{
Debug.Log(i);
}
}
// Update is called once per frame
void Update () {
//ここは なにもなくても1行空けなければならない emptyステートメントが間違っている可能性があります と警告が出る。
}
}

今回も最後までご覧いただきましてまことにありがとうございました。

次回は配列をやって行きます。

仮想空間VR:はじめてのUnity2018 C# Debug.Log()

こんにちは、かず まなぶ です。

本日、はじめてUnity2018 C# を触りましたので、使い方をメモっていきます。

オブジェクトにカラのC#ファイルをアタッチしまして、コンソールへの出力を試しました。

数値と文字列を定義する書式、そして演算についてまとめておきます。

はじめてC#のコードを書きましたが、pythonに負けず劣らずとても見やすいです。

それもそのはず、C#は C言語を進化させた C++ を さらに進化させた C++++というコンセプトだそうです。++++を合体させて#にしたっぽいです。

なので、本当は シーシャープ でなくて

シープラプラプラプラ!!

オラオラオラァ!!(; ・`д・´) ザッ ワールド!!

using System.Collections;//データを格納する型を提供してくれる
using System.Collections.Generic;//データを格納する型を提供してくれる
using UnityEngine;//Unityを動かすために必要な機能を提供してくれる
public class Test : MonoBehaviour {//クラス名はスクリプト名と同じ意味
// Use this for initialization スタートメソド:起動すると 最初だけ実行されるブロック
void Start () {//キャラクターを表示する
Debug.Log("コンソールウィンドウにこの文章を表示します");//この"セミコロン"を絶対に忘れないこと!!
int age;
age = 30;
Debug.Log(age);
float height1 = 160.5f;//浮動小数点型 小数点をつける場合は必ず最後にfをつけること
float height2;
height2 = height1;//代入できます
Debug.Log(height2);
string name;//文字列の定義
name = "kitamura";
Debug.Log(name);
int answer1;
answer1 = 1 + 2;//数値同士を計算できる
Debug.Log(answer1);
int answer2;
answer2 = 1 - 2;//数値同士を計算できる
Debug.Log(answer2);
int answer3;
answer3 = 1 * 2;//数値同士を計算できる
Debug.Log(answer3);
int answer4;
answer4 = 1 / 2;//数値同士を計算できる
Debug.Log(answer4);
int n1 = 8;
int n2 = 9;
int answer5;
answer5 = n1 + n2;//変数同士を計算できる
Debug.Log(answer5);
int answer6 = 10;
answer6 += 5;//変数の値を一定値 増やす
Debug.Log(answer6);
int answer7 = 10;
answer7 -= 5;//変数の値を一定値 減らす
Debug.Log(answer7);
int answer8 = 10;
answer8 ++;//変数の値を 1増やす インクリメント演算子
Debug.Log(answer8);
int answer9 = 10;
answer9 --;//変数の値を 1減らす デクリメント演算子
Debug.Log(answer9);
string str1 = "happy";
string str2 = "birthday";
string message;
message = str1 + str2;//文字列の足し算
Debug.Log(message);
str1 += str2;//文字列の足し算
Debug.Log(str1);
string str3 = "happy";
int num = 123;
string str4=str3+num;//文字列と数値の足し算
Debug.Log(str4);
 }
// Update is called once per frame アップデートメソド:フレームを更新するブロック
void Update () {//キャラクターを動かす Time.deltaTimeにフレーム時間ステップが代入される
}
}

本日も見ていただきまして、ありがとうございました。

次回は、if-else と for構文をやっていきましょう。

仮想空間VR:やっていきます宣言(=゚ω゚)ノ

こんにちは、かずまなぶ です。

本日も

コワーキングスペース秋葉原Weeyble

さんにお邪魔しています。

Unity2018でVRを作っていきます。

さあ、本日中にどこまでできるか!

インストールしましょう

いずれもライセンスうんたら聞いてきますが、「合意する」にチェックをいれればOKです。

  1. Unity 2018 personal バージョン 無料
  2. Java SE開発キット10 (jdk-10.0.2_windows-x64_bin.exe)←これではだめだった。
  3. Java SE開発キット8u181(jdk-8u181-windows-x64.exe)←こっちです。Unity2018はJDK8対応だそうです
  4. Android Studio (3.1.4 for Windows 64-bit (790 MB)←chromの翻訳機能がONになっているとダウンロードボタンが反応しませんので、オフにしてください。

デバイス

Lenovo スタンドアローンVRヘッドセット Mirage Solo with Daydream

参考文献

楽しい!Unityシェーダー お絵描き入門!←シェーダー言語ってやつです。

圧倒的python:moduleを自作しよう!!

こんにちは かず まなぶです。

今日は、

コワーキングスペース秋葉原Weeyble

さんにお邪魔して、もくもく会の仲間たちと揉まれながら(酒を飲みながら)モジュールの作り方を学んでいきます。※本当はword pressをやりたかった・・・

モジュールを作ったら、pathの通っているディレクトリに なんちゃら.py で保存しましょう。

私はjupyter notebokを使っているので、そこのディレクトリにいれました。

# test_module.py
"""
モジュール命名のルール
(1)頭に数字禁止
(2)ドット禁止
(3)小文字のみを使用する
"""
value1 = 100 #モジュール内の変数を定義
def function1(): #モジュール内の関数を定義
print("function1が実行されました")
class class1: #モジュール内のクラスを定義
def method1(self,arg1,arg2): #モジュール内のメソドを定義
self.value2 = 300 #モジュール内のアトリビュートを定義
self.value3 = arg1 + arg2
print("class1.method1()が実行されました")
return (self.value3)
if __name__ == "__main__":
print("ファイルとして実行された時だけ実行される部分")
print("モジュールの動作確認に使うといいよ")
# 動作確認
print(value1) # 100
print(function1()) # function1が実行されました
instance = class1() # インスタンスの作成
print(instance.method1(200,400)) # 600
print(instance.value2) # 300 ※ method1を1度実行すると、value2が定義されます。

では、自作モジュールを使ってみましょう。

import test_module as tm
tm.value1 # 変数 100
tm.function1() # 関数 function1が実行されました
instance=tm.class1() # クラス インスタンスを作成
instance.method1(200,400) # メソド 600 class1.method1()が実行されました
instance.value2 # アトリビュート 300

やりました! 

自作モジュールで定義したvalue1 も呼び出せているし 関数function1もちゃんと機能しています。

class1もmethod1も機能しています!

あとはアイデア次第で無限の可能性があります。

お疲れさまでした。目標達成です。

今日は帰って寝ます。最後まで見ていただきましてありがとうございました。

(=゚ω゚)ノ かずまなぶ。

圧倒的python:関数 そして クラスとメソドの作成方法

こんにちは (‘ω’) かず まなぶ です。

今日も Python やっていきましょう。 実務でコードを書いているとモジュールの作り方を忘れがちなので、備忘録としてまとめておきたいと思います。

が!その前にモジュール以前であるクラスとメソッドの作り方、そしてさらに戻って、関数の作り方まで Python 始めたばっかりの方の為に残しておこうと思います。

  1.  関数の作り方
  2. クラスとメソッドの作り方
  3. モジュールの作り方

例題として二つの数の平均を求めるプログラムを考えてみます。

ベタ打ち:関数もなにも使わない場合

まず関数を使わない場合のシンプルなコードを書いてみます。

5回繰り返してみましょう。

# 関数を使わない場合
answer = ( 10 + 20 ) / 2.0 # 15.0
answer = ( 30 + 60 ) / 2.0 # 45.0
answer = ( 95 + 87 ) / 2.0 # 91.0
answer = ( 30 + 20 ) / 2.0 # 25.0
answer = ( 15 + 17 ) / 2.0 # 16.0

1行だけ作って、それをコピーして中の数値を書き換えただけです。シンプルですね。

関数を使った場合

こちらも5回やってみました。

def function1(arg1,arg2):
anser = ( arg1 + arg2 ) / 2
return anser
function1( 10 , 20 ) # 15.0
function1( 60 , 60 ) # 45.0
function1( 95 , 87 ) # 91.0
function1( 30 , 20 ) # 25.0
function1( 15 , 17 ) # 16.0

function 1という関数を定義して引数arg1,arg2を指定することによって毎回同じ 行の answer = ( arg1 + arg2 ) / 2 という計算を繰り返しています。

5回繰り返す程度では逆にコード自体は長くなっています。

しかし、

実用面では関数を何千回、何万回繰り返す

場合や

演算式がとても複雑になりがち

なので、 関数としてまとめておくと、圧倒的に全体の行数は減りますし、修正の手間は格段に少なくなります。

相当昔からあるプログラミングの表現方法なのでしっかり使えるようになりましょう。

実際仕事で何かしら、計算しようと思ったらこの

関数だけあれば、なんとかなります。

クラスとメソドを作ってみる

もっとこのプログラムに拡張性を持たせたり流用したりソフトウェアっぽくしてみたり、そういった場合に次のクラスとメソッドを使ってみましょう。

メソドといえども、最初は関数として作ってみて、動きを確認しましょう。

#メソドといえども、最初は関数として作ってみる
def distance(a,b): # 1.原点からの距離を求めるメソッド
s=(a*a+b*b)**0.5 # 三平方の定理そのものです
return s
def angle(a,b): # 2.X 軸からの回転角度を求めるメソッド
from math import atan,degrees
theta=atan(b/a)
theta=degrees(theta) # rad から deg に変換
return theta
def porler(a,b): # 3.2と3を同時に求めるメソッド つまり極座標変換
porler_location=(distance(a,b) , angle(a,b))
return porler_location
print( distance(5,12) , "mm" ) # 13.0 mm 「ごじゅーに とーさん」 です
print( angle(5,12) , "deg" ) # 67.38013505195958 deg
print( porler(5,12) , "mm , deg") #(13.0, 67.38013505195958) mm , deg

次にクラスとメソドの基本形(ひな形)を確認しましょう。

# クラス メソド の 基本形
class class1: #クラスの定義 引数の( ) はつかない。( )が付くと、クラスの承継という次のステップの話になる。
def method1(self,a,b,c): #メソドの定義 引数にselfが入っているのが 関数との違い。
self.value1 = a + b + c #アトリビュートの定義 変数名にself.と入っているのが 関数との違い。
self.value2 = a - b * c #アトリビュートの定義 変数名にself.と入っているのが 関数との違い
value3 = self.value1 * self.value2 #アトリビュートでない変数も関数と同じく使える。ただし、保持されない。
print("value3:",value3)
print("class1.method1が実行されました。")
# クラスのインスタンス(クラスのコピー品)を作成する <__main__.class1 at 0x276a5de53c8>
instance1 = class1()
#クラスのメソドを実行する。 ピリオド
instance1.method1(1,2,3) #"class1.method1が実行されました。"
#アトリビュートはメソドを抜けても保持される。
instance1.value1 # 6
instance1.value2 # -5
#普通の変数はメソドを抜けると消える。
#value3 # NameError: name 'value3' is not defined
#インスタンス(クラスのコピー品)は、何個でも作れる。
instance2 = class1()
instance3 = class1()
instance4 = class1()

では、関数をメソドに書き換えていきましょう。

#クラスにする 基本設計図のようなもの、これをコピーして使う
"""
1.class を頭につける
2.def を字下げする ここがメソドになる
3.self. を引数の先頭にいれる これがメソドの特徴
4.インスタンスを作成する   classという基本設計図のコピー
5.printする変数名の頭にインスタンス名 instance.をつける
"""
class class1:
def distance(self,a,b): # 1.原点からの距離を求めるメソッド
s=(a*a+b*b)**0.5 # 三平方の定理そのものです
return s
def angle(self,a,b): # 2.X 軸からの回転角度を求めるメソッド
from math import atan,degrees
theta=atan(b/a)
theta=degrees(theta) # rad から deg に変換
return theta
def porler(self,a,b): # 3.2と3を同時に求めるメソッド つまり極座標変換
porler_location=(distance(a,b) , angle(a,b))
return porler_location
#インスタンスの作成
instance = class1() #こっちは ( ) をつける。理由は別途
print( instance.distance(5,12) , "mm" ) # 13.0 mm 「ごじゅーに とーさん」 です
print( instance.angle(5,12) , "deg" ) # 67.38013505195958 deg
print( instance.porler(5,12) , "mm , deg") #(13.0, 67.38013505195958) mm , deg

と、こうなります。

実際、仕事でやる技術計算でも、使ったことはありません。結果が解ればいいので、ベタ打ちで数式を書いていって、まとめたほうがすっきりするところは、関数にまとめなおす感じです。

次回予告

本日も、最後まで見てくださいまして、まことにありがとうございました。次回は、モジュールの作り方をやっていきましょう。(‘ω’)かず まなぶ

圧倒的に自動化:pyautogui でマウスとキーボードを自動化 on python

こんにちは、(‘ω’) かず まなぶ です

今日も圧倒的仕事の自動化について使えるモジュールを紹介したいと思います。

その名も、パイオート グイ ( pyautogui ) .

ネーミングが長いんで私は省略して ピーエー( PA ) と呼んでいます。

マウスの動きだとかキーボードのタイピングの動きを丸ごと Pythonからコードによって自動 操作してしまうという、

” 原始的で画期的 “

なモジュールです。

ディスプレイ操作

#

import pyautogui as pa
# ディスプレイのサイズを取得する
max_x,max_y = pa.size() # (1920, 1080) タプルで出力される
max_x # 1920
max_y # 1080
# マウスの座標を取得する
p_x,p_y = pa.position() # (675, 766) タプルで出力される
p_x # 675
p_y # 766
# 指定画像と同一の画像をディスプレイ内から認識し、座標を取得する
p_x,p_y = pa.locateCenterOnScreen("c:\\MyPythonScripts/img/pa_search_img.png") # (264, 120) 画像をあらかじめ用意しておく。
p_x # 264 注意:ブラウザの表示倍率を変えてしまうと、違う画像になってしまうので認識しない。
p_y # 120
pos_x,pos_y,size_x,size_y = pa.locateOnScreen("target.png") #それぞれの要素をとる
pos = pa.locateOnScreen("target.png") #配列に格納してとる
pos_x,pos_y = pa.center("target.png") #画像の中心座標を取る
pa.locateOnScreen("someButton.png", region=(0,0, 300, 400)) # region=サーチ範囲
pa.locateOnScreen("button_img.png", grayscale=True, region=(0,0, 300, 400) )# グレースケールで画像を認識する
pa.locateOnScreen("button_img.png", grayscale=True,tolerance=10 ,region=(0,0, 300, 400)) #マッチ誤差(tolerance)[0-100%]を取得する
# スクリーンショット
pa.screenshot("c:\\MyPythonScripts/img/screenshot_img.png") # 全体
pa.screenshot(region=(1,1, 640, 480))# 矩形範囲指定

マウス自動操作

#

import pyautogui as pa
# マウス移動、移動先の(x,y)と移動にかける時間(duration)を秒で指定
pa.moveTo(100, 200, duration=1) # 座標(100,200)に 5 秒かけて移動する
pa.moveTo( 1, 1, duration=1) # 左上の頂点は(1,1) 座標(0,0)は フェイルセーフ として機能し処理が強制終了する。
pa.moveRel(100, 200, duration=1) #マウス移動、相対座標で指定する
#マウスドラッグ&ドロップ
pa.moveTo(300, 300, duration=1) # いったん移動だけして
pa.dragTo(500, 300, duration=1) # 指定座標までドラッグ $ドラップ
pa.dragTo(300, 500, duration=1)
pa.dragTo(500, 500, duration=1)
pa.dragRel(10, 5, duration=1) # 相対座標も使える
#マウスクリック
x=100
y=100
pa.click(x,y) #左 
pa.rightClick(x, y) #右
pa.middleClick(x, y) #真ん中
pa.doubleClick(x, y) #左ダブル
pa.tripleClick(x, y) #左トリプル
pa.mouseDown(x, y, button='left') #押しっぱなし
pa.mouseUp(x, y, button='left') #解放
pa.click(x,y, clicks=3, interval=1, button='left') # 連射 10クリック 1秒間隔で 左クリック
#マウスホイール
pa.scroll(1000, 1000, 1000) # スクロール合計,x,y
pa.hscroll(10) # 水平スクロール

キーボード自動

#

import pyautogui as pa
pa.keyDown(key_name) # キーボードを押下する
pa.keyUp(key_name) # キーボードを押上する
pa.hotkey("ctrl", "a") # ショートカットキーを押す
pa.hotkey("ctrl", "c")
pa.hotkey("ctrl", "v")
pa.press("shift", presses=2, interval=0.5) # 連射する 2回 0.5秒インターバルで
pa.typewrite("hello world!") #文字列を打つ
# 使えるキー名
KEYBOAD_KEYS = ["\t", "\n", "\r", " ", "!", """, "#", "$", "%", "&", """, "(",
")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7",
"8", "9", ":", ";", "<", "=", ">", "?", "@", "[", "\\", "]", "^", "_", "`",
"a", "b", "c", "d", "e","f", "g", "h", "i", "j", "k", "l", "m", "n", "o",
"p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~",
"accept", "add", "alt", "altleft", "altright", "apps", "backspace",
"browserback", "browserfavorites", "browserforward", "browserhome",
"browserrefresh", "browsersearch", "browserstop", "capslock", "clear",
"convert", "ctrl", "ctrlleft", "ctrlright", "decimal", "del", "delete",
"divide", "down", "end", "enter", "esc", "escape", "execute", "f1", "f10",
"f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f2", "f20",
"f21", "f22", "f23", "f24", "f3", "f4", "f5", "f6", "f7", "f8", "f9",
"final", "fn", "hanguel", "hangul", "hanja", "help", "home", "insert", "junja",
"kana", "kanji", "launchapp1", "launchapp2", "launchmail",
"launchmediaselect", "left", "modechange", "multiply", "nexttrack",
"nonconvert", "num0", "num1", "num2", "num3", "num4", "num5", "num6",
"num7", "num8", "num9", "numlock", "pagedown", "pageup", "pause", "pgdn",
"pgup", "playpause", "prevtrack", "print", "printscreen", "prntscrn",
"prtsc", "prtscr", "return", "right", "scrolllock", "select", "separator",
"shift", "shiftleft", "shiftright", "sleep", "space", "stop", "subtract", "tab",
"up", "volumedown", "volumemute", "volumeup", "win", "winleft", "winright", "yen",
"command", "option", "optionleft", "optionright"]

前回ご紹介いたしました selenium と組み合わせると、自動化の実現可能性が飛躍的に高まります。

本日も最後まで見ていただきまして誠にありがとうございました。(‘ω’) かず まなぶ

圧倒的に自動化:Seleniumを使う。webブラウザ on python

今日は ”(‘ω’) かず まなぶ” です。

最近 Web ブラウザを使ったソフトウェアってすごく多くないですか?

毎日の仕事の中で

同じような繰り返し作業

があったらそれ、

自動化してみたい

と思いませんか。

私は selenium を使っています。

今日は selenium のさわりだけですが、皆さんに紹介したいと思います。

検索エンジンに調べたいワードをに入力して検索するというところまで自動化してみました。

from selenium import webdriver
search_word="youtube selenium"
#ウェブドライバを読み込む
driver=webdriver.Chrome(r"C:\driver\chromedriver_win32\chromedriver.exe")
driver.get(r"http://www.yahoo.co.jp") #ブラウザでWEBサイトを開く
#driver.get(r"file:///C:/Users/omoiy") #ブラウザでフォルダを開くこともできる
#htmlソース内の検索textboxである id="srchtxt"をWebElementとして抽出する
elem_search_word = driver.find_element_by_id("srchtxt")
#WebElementに検索ワードを書き込む
elem_search_word.send_keys(search_word)
elem_search_btn = driver.find_element_by_id("srchbtn")#検索ボタンのidを取得
elem_search_btn.click() #検索ボタンを押す
driver.maximize_window()#カレントウインドウを最大化する

このように、アイディア次第では色んなことができます。

今回は Google Chromeで行ったので簡単でしたが、これを Internet Explorer 11でやろうとすると結構大変でした。

レジストリの追加をするという作業があります。

これを会社でやろうとすると十中八九、情報システム部にお叱りを受けます。気をつけましょう。

Internet Explorer 11の場合

1. 公式サイトより IEDriverServer_Win32_3.9.0.zip をダウンロードし解凍。webdriver パス指定の場所に移動。
2. IEの詳細設定の拡張保護モードを有効にする。
3. IEのセキュリティを中、保護モードをオン。(制限付きサイトだけは高。なぜか変更できない)
4. 64ビット版の指示の通り regedit でレジストリを編集
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BFCACHEを新規に作成。iexplore.exeを新規作成し DWORDを16進数で0に設定した。
5.ブラウザの拡大を100%に設定
6.PCを再起動

しかし、疑問点がいくつか。

(1)なぜ64bitなのにwin32のドライバーで動くのか?x64では動かない。
(2)公式サイトによると拡張保護モードは無効にすると書いてある(逆)。

'''
IE11の場合
'''
from selenium import webdriver
driver = webdriver.Ie(r"D:\web_driver\IEDriverServer_x64_3.9.0\IEDriverServer.exe") #IEのドライバ
driver.get("URLをいれます。")#Web 情報を取得(Web ブラウザを開く)
driver.close()#IEドライバを閉じる

本日も最後まで見ていただきまして、ありがとうございました。(‘ω’) かず まなぶ

圧倒的使い分け:pythonのlist , array , numpy.array , pandas.Seriese , pandas.DataFrame

今日はかずまなぶです。

Python でデータを処理するときにベクトルだったり行列だったり使うわけですが、じゃあどれを使ったらいいのかって迷ったことありませんか?私はいつも迷ってます。

そんな毎日に終止符を打つべく今回はしっかりと、まとめていきたいと思います。

私たちの選択肢は,

  1. list                             (Python標準の組み込み型 インポート不要)
  2. array.array              (Pythonの標準モジュール)
  3. numpy.array           (数値計算ライブラリ NumPy。行列演算)
  4. pandas.Series          (データベース分析ライブラリPandas。ベクトル)
  5. pandas.DataFrame(データベース分析ライブラリPandas。行列)

list

まずは、listを確認しましょう。

# listの使い方
li_1d = [1,2,3,4] # ベクトルっぽく
li_2d = [ [1,2,3] , [4,5,6] , [7,8,9] ] #行列っぽく
# 取り出し方
li_1d[1] # 2
li_2d[1][2] # 6
# 演算は期待できない
li_1d + li_1d # [1, 2, 3, 4, 1, 2, 3, 4]
li_2d + li_2d # [[1, 2, 3], [4, 5, 6], [7, 8, 9], [1, 2, 3], [4, 5, 6], [7, 8, 9]]
# max() , min() ,sum() , len() はよく使う
max(li_1d) # 4
min(li_1d) # 1
sum(li_1d) # 10
len(li_1d) # 4
# for文のシーケンスとしてよく使う
li_str = ["a","b","c"]
for s in li_str:
print(s)
# a
# b
# c

カンタンにデータの入れ物をつくるならlistは便利ですね。最も輝かしい使い方は、

for構文のインデックス番号として

使われることだと思います。

こんな応用もあります。よく使います。(zip , enumrate)

array.array

では次の、arrayモジュールの array.arrayを確認しましょう。

# arrayモジュールの使い方
import array as ar
#型指定が必要
#ベクトルしか表現できない
ar_int = ar.array("i",[1 , 2 , 3 , 4 ]) # 中身をint型で指定
ar_float = ar.array("f",[1.0 , 2.0 , 3.0 , 4.0]) # 中身をfloat型で指定
type(ar_int) #array.array型
type(ar_float) #array.array型
# 基本的にlistと同じ
ar_int[1] # 2
ar_int+ar_int # array('i', [1, 2, 3, 4, 1, 2, 3, 4])
max(ar_int) # 4
min(ar_int) # 1
sum(ar_int) # 10
len(ar_int) # 4

結論として、これは使う必要はありませんね。忘れましょう。

numpy.array

ここからが本番、numpy.array です。

行列演算をするなら

これで決まり。

import numpy as np
ar_1d=np.array( [1,2,3] ) # array([1, 2, 3])
ar_2d=np.array( [ [1,2,3],[4,5,6] ] ) # array([[1, 2, 3],[4, 5, 6]])
type(ar_1d) #numpy.ndarray
ar_3d=np.array( [ [ [1,2,3],[4,5,6] ],[ [1,2,3],[4,5,6] ] ] ) # 3次元配列も可能
# 行列演算
ar_1=np.array([1,2,3])
ar_2=np.array([4,5,6])
sumation=ar_1 + ar_2 # 和算 array([5, 7, 9])
product=np.dot(ar_1,ar_2) # 内積 32
ar_3=np.array([[1,2],[3,4]])
ar_4=np.array([[5,6,7],[8,9,10]])
product=np.dot(ar_3,ar_4) # 内積 array([[21, 24, 27],[47, 54, 61]])

pandas.DataFrame

いよいよpandasです。pandas.Seriesはぶっちゃけ要らないです。なので飛ばして、pandas.DataFrameを確認しましょう。データの取り込み、表計算やSQLのような使い勝手です。時系列処理、文字列と数値が混ざっているデータでも処理できます。データの欠損があっても取り込めますし、除去することもできます。

まさに、データベース分析ライブラリ。

# pandasでデータを取り込む# pandasでデータを取り込む
import pandas as pd
#まずはcsvファイルからカンマ区切り読み込む。
df=pd.read_csv("c:\\MyPythonScripts\\data\\sample_data.csv",index_col=0) # index_col=0 インデックスの列をオフにする
# name stage1 stage2 stage3 stage4
# Alice 24 45 64 54
# Bob 42 45 89 48
# Char 18 70 78 98
# Dave 68 89 25 49
df # pandas.core.frame.DataFrame
df.index # Index(['Alice', 'Bob', 'Char', 'Dave'], dtype='object', name='name')
df.keys()# Index(['stage1', 'stage2', 'stage3', 'stage4'], dtype='object')
# データの取り出す
df["stage3"] # 列 column を取り出す
# name
# Alice 64
# Bob 89
# Char 78
# Dave 25
# Name: stage3, dtype: int64
# かんたんな計算をする
df2=df["stage3"] + df["stage4"]
#name
#Alice 118
#Bob 137
#3Char 176
#Dave 74
# dtype: int64
#グラフを見る
import matplotlib.pyplot as plt
df.plot()
plt.show()
# データを変換する
li=list(df["stage3"]) # リストに変換  :[64, 89, 78, 25]
import numpy as np
ar=np.array(df["stage3"]) # np.ndarrayに変換 :array([64, 89, 78, 25], dtype=int64)
# データをpandas.DataFrame に再変換する。
df_li=pd.DataFrame(li) # pandas.core.frame.DataFrame
df_ar=pd.DataFrame(ar) # pandas.core.frame.DataFrame
# name stage1 stage2 stage3 stage4
# Alice 24 45 64 54
# Bob 42 45 89 48
# Char 18 70 78 98
# Dave 68 89 25 49
df.index # Index(['Alice', 'Bob', 'Char', 'Dave'], dtype='object', name='name')
df.keys()# Index(['stage1', 'stage2', 'stage3', 'stage4'], dtype='object')
# データの取り出す
df["stage3"] # 列 column を取り出す
# name
# Alice 64
# Bob 89
# Char 78
# Dave 25
# Name: stage3, dtype: int64
# かんたんな計算をする
df2=df["stage3"] + df["stage4"]
#name
#Alice 118
#Bob 137
#3Char 176
#Dave 74
# dtype: int64
#グラフを見る
import matplotlib.pyplot as plt
df.plot()
plt.show()
# データを変換する
li=list(df["stage3"]) # リストに変換  :[64, 89, 78, 25]
import numpy as np
ar=np.array(df["stage3"]) # np.ndarrayに変換 :array([64, 89, 78, 25], dtype=int64)
# データをpandas.DataFrame に再変換する。
df_li=pd.DataFrame(li) # pandas.core.frame.DataFrame
df_ar=pd.DataFrame(ar) # pandas.core.frame.DataFrame

pandas.DataFrameはデータの取り込みと成形は得意ですが、演算はそれほどではなさそうです。演算はnumpy.narrayに任せましょう。

まとめ

  • それぞれの得意分野を明らかにしました。
  • array.array と pandas.Series の存在は忘れましょう。
  • データの操作は、以下のような順番が良いと考えます。
  1. pandas.read_csv(“ファイル名.csv”,index_col=0) でデータフレームとして取り込む。
  2. pandasでデータフレームを成形する。
  3. データフレームからnumpy.arrayに変換して、演算する。
  4. 結果を再びpandasのデータフレームに変換する。

本日も最後まで見ていただきまして誠にありがとうございます。

(‘ω’)かず まなぶ

次回からは、取り込んだデータを整形するというテーマでpandas.DataFrameを深掘りしていきましょう。

圧倒的:Python 初心者向けのハンズオンやります。

急遽開催いたします。川崎近辺でpythonの勉強会がないんですよね、と相談したら、やってくれる講師の方を見つけました。とりあえず場所は確保しますので、参加したい方はご連絡ください。 正確な場所が決まり次第、個別にご連絡します。

場所日時

  • 場所 :川崎駅 徒歩5分くらい。
  • 開催日:最初の参加表明から1週間前後が目安。希望日と会議室の空き状況で調整します。
  • 時間 :平日18:00~20:00 土日15:00~17:00の2時間

募集人数

  • 最大参加人数13名 ちょっと狭い。
  • 最大5名にします。 少数精鋭で効率よくやりましょう。
  • 1名なら最高に効率がいいです。1名の日はラッキーです。

参加費用

  • 受講料:2980円 税別→書籍執筆キャンペーン中のため0円
  • 場所代:1000円 (当日現金)

得られるもの

  • Anaconda のインストール方法
  • Anaconda の使い方 (Jupyter Notebook)
  • Python の基礎(データ型、繰り返し構文 ハンズオン)
  • 仕事の自動化にすぐに使えるPython モジュール群(動かしてみましょう)
  • 自分で学べる推薦図書
  • 圧倒的pythonもくもく会参加権(圧倒的pythonもくもく会に参加できます。また受講料が1回分無料になります。)

参加対象者

python初心者です、初級以上は含まれませんのでご注意ください。初級以上、機械学習などに特化した講義は別途開催します。ITエンジニアの方も非対象です。

もち物など

  • ノートPC windows10
  • anacond インストール済みが望ましいですが、入っていない方は、セミナー冒頭にハンズオンします。
  • 筆記用具:ボールペン、シャープペン、消しゴム、メモ帳
  • 名刺  :お持ちの方はセキュリティ上、2枚お見せください。1枚だけ頂戴します。
  • 服装  :自由です。Tシャツ、ジーパンでOKです。

講師:中森 啓太氏(メカニカルエンジニア)

IT関係のエンジニアではありません。日常の仕事、一般事務でも使えるような実用的なプログラミングをQuick and Dirty  に教えてくれます。