網頁

2017年1月29日 星期日

Makefile

Target:Prequeite

$@ Target的檔名

$% 程式庫成員中的檔名元素

$< 第一個prequeite的檔名

$? Timestamp 在Target之後的Prequeite

$^ 所有的Prequeite的檔名 但不包含重複部分

$+ 所有的Prequeite的檔名

$* Target的主檔名


Makefile的賦值運算符(=, :=, +=, ?=)

1. ?=

這個是適用於想表達如果?=左邊的變數從未被設定過的話 就讓它設定成右邊的內容、數值

如果已經有值了 就不進行任何變動

2. =

在makefile官方文件中 使用=的時機是希望讓左邊的變數成為"recursively expanded variable" 也就是當變數真的被使用到的時候 在進行遞迴展開

所以就可以先定義 後續再補數值

以下提供一個例子

CFLAGS = $(include_dirs) -O

include_dirs = -Ifoo -Ibar

如果使用以上兩行的定義 當CFLAGS真的要被使用時就會展開成 -lfoo -lbar -O 所以可以後定義、補充include_dirs的內容

然後這樣子的特性可能會帶來兩個壞處

第一個是有可能造成無限遞迴 以下就是一個例子 不過這個makefile會提示bug 所以倒也還好修正

CFLAGS = $(CFLAGS) -O

CFLAGS要被使用時會造成無限迴圈

另外一個壞處是跟效能有關的:

因為遞迴展開也適用於函式 所以函式的展開執行也會發生在變數要被使用的時候 也就是說如果變數要被重複使用幾次 函式就會展開跑幾次

所以效能就可能不太好

3. :=

在markfile官方文件中 使用:=的時機是希望讓左邊的變數成為"Simply expanded variable" 也就是當這一行敘述被執行時 就馬上進行展開

所以一旦跑完:=後 就不再存在任何reference在變數中

4. +=

最後一個是+= 用來增加敘述在原有已經定義的變數中

如果+=左邊的變數還沒定義過 那+=執行的效果就會跟=一樣 也就是recursively-expanded variable.

如果變數曾經定義過 那+=跑起來的效果就會視前一次定義是用=或者:=來決定跑完後是recursively-expanded variable或者是simply expanded variable

ex

1. =

make會將整個makefile展開後,才決定變數的值。也就是说,變數的值會是整個Makefile中最後被指定的值。看例子:

x = hello
y = $(x) world!
x = hi

all:
@echo $(y)

在上例中,輸出結果將會是 hi world! ,而不是 hello world!

2. :=

變數的值在Makefile展開途中就會被給定,而不是整個Makefile展開後的最终值。

x := hello
y := $(x) world!
x := hi

all:
@echo $(y)

輸出結果 ====> hello world!

2017年1月23日 星期一

git 團隊

下載遠端數據庫
git pull #才能從別的相同clone資料夾或別的電腦看到github的commit

遠端衝突
A和B都pull remote repository commit
A修改後commit push
B修改後commit push會顯示衝突
B pull remote repository commit
此時pull的檔案會是merge A和B的檔案

存放網頁空間流程
Setting -> Github Pages -> Source -> 選分支後上方會出現網址

小型團隊分支協作
A在master先分支一個develop
B在develop用一個分支
B開發完後A在develop merge B的分支
最後A再回到master merge develop
然後push master和develop到remote repository


git pull = git fetch + git merge
練習完 pull 時,可以知道他就是將遠端的分支將你的本地分支進行合併 merge 的動作,
但有時候你不希望 pull 下來導致自己的數據庫太亂又擔心有衝突時,可以先使用下面這個指令。

git fetch origin(遠端數據庫) branch1(遠端分支)

此時你的分支會多一個 FETCH_HEAD 的分支,這個就是遠端數據庫的分支,可以等到你看過沒問題後,
再合併 FETCH_HEAD 也 ok。

push branch 到 remote repository

沒有要推送分支的話
$ git push

git remote #查詢遠端數據庫
git remote rename 原名稱 修改名稱
git push origin branch名稱 #origin:clone預設遠端主機名稱

push local repository
git remote add origin https://github.com/chiustin/python.git
git push origin master/branch

git暫存

儲存一個暫存檔
另外也可以將此暫存檔移到另一個分支
$ git stash #暫時儲存暫時目錄
$ git stash list #瀏覽git stash 列表
$ git stash pop #還原暫存
$ git stash drop #清除最新暫存
$ git stash clear #清除全部暫存

git 標籤

git tag #查詢標籤
git tag -n #查詢詳細標籤
git tag -d #刪除標籤
git tag 標籤名稱 #新增輕量標籤
git tag -am "備註名稱" 標籤名稱 #新增標示標籤
git checkout 標籤名稱 #切換到標籤的commit

分支

HEAD 是目前所在位置指標
git branch #瀏覽目前分支
git checkout commit識別碼 #將HEAD指向之前的committed
git checkout master #將HEAD指回原本committed

分支
git branch 名稱
git checkout 名稱

合併

case 1
開分支再將此分支commit
git merge 分支名稱 #在master位置

#分支還是保持一樣檔案內容

case 2 分支合併到修改過的master
開分支"插入"新的內容
再將此分支commit
接著將master也做修改commit
git merge 分支名稱
會將master跟分支修改的東西一起合併

 case 3 衝突
開分支"修改"原本的內容
再將此分支commit
接著master也修改剛剛分支修改的內容再commit
git merge 分支名稱
會顯示HEAD跟分支的內容
手動修改






2017年1月22日 星期日

gitignore

目的是如果想要測試東西時
不想讓git status追蹤的話
可以使用

touch 名稱.gitignore
*.html #忽略檔案
folder/ #忽略資料夾

2017年1月21日 星期六

Markdown

# 課堂中的範例
## 粗體或斜體
**This is bold**
---
*This is tilt*
## 機器學習演算法的清單
- 分類
    - 決策樹
    - 羅吉斯回歸
    - ...etc
- 分群
    -
    -
    -...etc
- 迴歸
    -
    -
    -...etc

## 不想被執行的程式

這是一個 Inline code: `print(Hello World)`

這是一個 Code chunk:

```python
print("Penny Lane")
```

## 我最喜歡的樂團

|樂團名|主唱|
|-----|----|
|May  |Sien|
|Come |GG  |


## 參考連結

- [Penny Lane] - (https://backlogtool.com/git-guide/tw/reference/)
- [other] - (https://zlargon.gitbooks.io/git-tutorial/content/branch/commit_tree.html)

- 圖片:

![](https://www.qnap.com/QPKG/img/python_640x400.png)


---

> "This is Python"

git檔案管理

檔案狀態可以分成三種
Changes to be committed #執行git add後
Changes not staged for commit #已經git add後再修改檔案
Untracked files #建立新的檔案

#一個檔案可以同時Changes to be committed
#Changes not staged for commit

檢視檔案
$ git status #顯示修改檔案清單
$ git diff #查看修改檔案差異
$ git log #顯示commit紀錄
$ git show #查看commit的詳細記錄

註冊檔案或目錄到index
$ git add

刪除檔案
$ git rm 

#會先把檔案移除index變成Changes not staged for commit
#等commit -m之後才會真正刪除檔案

還原和刪除檔案

已註冊到index的檔案做"修改"後
狀態也會從Changes to be committed變成
Changes not staged for commit
如果要把Changes not staged for commit檔案
"還原檔案"變成
$ git checkout -- file

#此時檔案狀態也會改回Changes to be committed
#不管是modified或deleted都可以還原檔案內容

把檔案狀態從Changes to be committed變成
Changes not staged for commit
也就是檔案"取消index"
$ git reset HEAD file

還原工作目錄和index
和最後commit一樣
先將Changes to be committed
Changes not staged for commit
Untracked files
三種狀態index先變成Changes to be committed

$ git add. #先全部變成Changes to be committed
$ git reset --hard #將Changes to be committed檔案刪除














git分支

建立新分支前,要先add一個新檔案和commit一次才能建立master分支

列出現在有的分支。
$ git branch

建立分支
$ git branch 分支名稱

修改分支
$ git branch -m 舊分支名稱 新分支名稱

刪除分支
$ git brand -d 分支名稱

切換分支
$ git checkout 分支名稱

合併分支
$ git merge 分支名稱


git基本操作

設定git
$ git config --global user.name "你的英文代號"
$ git config --global user.email 你的電子郵件
$ git config --list

顯示介面上色
$ git config --global color.ui true

創一個資料夾
$ mkdir python
$ cd python

啟動git,讓git追蹤資料夾底下的檔案跟資料夾
$ git init

取消追蹤的話
$ rm -rf .git

可以查詢檔案狀況
$ git status

新增和修改檔案
$ git add python.py 或者 $ git add .

刪除檔案
$ git rm python.py

#實際手動刪除檔案後,在還要再輸入一次這個指令讓 git 知道,
這個檔案已經被刪掉了,不然會一直追蹤。

儲存本次更新
$ git commit -m "first commit" 

#註解內容會被記錄到下面log檔

查看之前儲存的紀錄點
$ git log

#commit 後方一串亂碼是紀錄點的識別碼

還原到你指定的紀錄點版本,之後所做的修改都不會保留著
$  git reset --hard 紀錄點的識別碼

回復到你指定的紀錄點版本,之後所做的修改都會保留著
$ git reset 紀錄點的識別碼

刪除你要刪除的文件名稱
$ git rm -r --cached 資料夾名稱

第一次建資料夾
$ git remote add origin https://github.com/chiustin/Machine-Learning.git

上傳
$ git push -u origin maste

2017年1月20日 星期五

找下一個質數

  1 #include<stdio.h>
  2 #include<math.h>
  3
  4 int main ()
  5 {
  6   int i, n;
  7   i = 2;
  8   printf ("輸入一個正整數,找出正整數後面一個質數\n");
  9   scanf ("%d", &n);
 10   while (i <= (int) sqrt(n)) {
 11     if (  n % i == 0 ) {
 12       n++;
 13       i = 1;
 14     }
 15     i++;
 16   }
 17   printf("質數 = %d\n",n);
 18   return 0;
 19 }

2017年1月17日 星期二

MPI_Comm_split以及worker_id的關係

第九章利用MPI_Comm_split產生出新的communicator叫做worker_comm

MPI_UNDEFINED: CPU=0的color沒有分類到worker_comm的communicator

//CPU=0
if (!id) {  
  MPI_Comm_split (MPI_COMM_WORLD, MPI_UNDEFINED, id, &worker_comm);
  manager (&argc, &argv, p);
}
//非CPU=0的processors
else {  
  MPI_Comm_split (MPI_COMM_WORLD, 0, id, &worker_comm);
  worker (&argc, &argv, worker_comm);
}

$ mpicc check_worker.c
$ mpirun -np 4 a.out

/* check_worker.c */
#include "stdio.h"
#include <mpi.h>

void manager (int argc, char *argv[], int p) {
  int id;
  MPI_Comm_rank (MPI_COMM_WORLD, &id);
  printf("manager id=%d\n", id);
  fflush (stdout);
}

void worker (int argc, char *argv[], MPI_Comm worker_comm) {
  int id;
  int worker_id;

  MPI_Comm_rank (MPI_COMM_WORLD, &id);
  printf("manager id=%d\n", id);
  fflush (stdout);

  MPI_Comm_rank (worker_comm, &worker_id);
  if (!worker_id) printf("worker id=%d\n", worker_id);
  if (worker_id) printf("worker id=%d\n", worker_id);
  fflush (stdout);
  //printf("%d", worker_id);
}

int main (int argc, char *argv[])
{
  int id, p;  
  MPI_Comm worker_comm; 

  MPI_Init (&argc, &argv);
  MPI_Comm_rank (MPI_COMM_WORLD, &id);
  MPI_Comm_size (MPI_COMM_WORLD, &p);

  if (!id) {  
    MPI_Comm_split (MPI_COMM_WORLD, MPI_UNDEFINED, id, &worker_comm);
    manager (&argc, &argv, p);
  }
  else {  
    MPI_Comm_split (MPI_COMM_WORLD, 0, id, &worker_comm);
    worker (&argc, &argv, worker_comm);
  }

  printf ("%d\n",prime[7]);
  return 0;

}

out:
manager id=0

manager id=1
worker id=0

manager id=2
worker id=1

manager id=3
worker id=2

從螢幕輸出可以發現
CPU1在worker_comm communicator的id變成0
CPU2在worker_comm communicator的id變成1
以此類推




2017年1月15日 星期日

物件

物件導向1
一個物件(Object)可以包含屬性(Attribute)與方法(Method)

import pandas as pd
name = ["蒙其·D·魯夫", "羅羅亞·索隆", "娜美", "騙人布", "賓什莫克·香吉士", "多尼多尼·喬巴", "妮可·羅賓", "佛朗基", "布魯克"] 
age = [19, 21, 20, 19, 21, 17, 30, 36, 90] 

# 建立 dict straw_hat_dict = {"name": name, "age": age } 

# 建立 data frame 
straw_hat_df = pd.DataFrame(straw_hat_dict) 
print(straw_hat_df.dtypes) # straw_hat_df 有 dtypes 屬性 
print(straw_hat.df.head()) # straw_hat_df 有 head 方法


物件導向2
一個物件(Object)屬於一種類別(Class)
定義類別

class Strawhat:
  ''' 
  這是一個叫做 Strawhat 的類別 
  ''' 
  def __init__(self, name, age): 
    self.name = name 
    self.age = age 

# 根據 Strawhat 類別建立兩個物件 
luffy = Strawhat("蒙其·D·魯夫", 19) 
zoro = Strawhat("羅羅亞·索隆", 21) 

# 使用屬性 
print(luffy.name) 
print(luffy.age) 
print(luffy.__doc__) 
print(zoro.name) 
print(zoro.age) 
print(zoro.__doc__)


物件導向3
定義類別的方法

class Strawhat: 
  ''' 這是一個叫做 Strawhat 的類別 ''' def __init__(self, name, age): self.name = name self.age = age def print_age_2_yr_ago(self): age_2_yr_age = self.age - 2 print(self.name, "兩年前是", age_2_yr_age, "歲。") # 根據 Strawhat 類別建立物件 luffy = Strawhat("蒙其·D·魯夫", 19) # 使用 luffy 的 print_age_2_yr_ago() 方法 luffy.print_age_2_yr_ago()

文字(str)
my_str = "python for Data science!!!"

print(my_str.startswith("Python"))
print(my_str.endswith("!"))
print(my_str.find("for"))
print(my_str.count("!"))
print(my_str.capitalize())
print(my_str.title())
print(my_str.upper())
print(my_str.lower())
print(my_str.swapcase())
print(my_str.replace("science", "analysis"))

out:
False
True 
Python for data science!!! 
Python For Data Science!!! 
PYTHON FOR DATA SCIENCE!!! 
python for data science!!! 
PYTHON FOR dATA SCIENCE!!! 
python for Data analysis!!!

list
age = [19, 21, 20, 19, 21, 17, 30, 36]

age.append(90)
print(age)
brook_age = age.pop()
print(brook_age)
print(age)
age.insert(8, brook_age)
age.remove(brook_age)
print(age)
print(age.index(21))
age.append(90)
age.append(90)
print(age.count(90))
age.sort()
print(age)
age.reverse()
print(age)

out:
[19, 21, 20, 19, 21, 17, 30, 36, 90]
90 
[19, 21, 20, 19, 21, 17, 30, 36] 
[19, 21, 20, 19, 21, 17, 30, 36] 
[17, 19, 19, 20, 21, 21, 30, 36, 90, 90] 
[90, 90, 36, 30, 21, 21, 20, 19, 19, 17]

dict
# as of 2016-12-13
team_name = "金州勇士隊"
wins = 21
losses = 4
win_percentage = 0.84
is_on_winning_streak = True

golden_state_warriors = {
    "team_name": team_name,
    "wins": wins,
    "losses": losses,
    "win_percentage": win_percentage,
    "is_on_winning_streak": is_on_winning_streak
}

print(golden_state_warriors.get("wins"))
print(golden_state_warriors.keys()) # 用 list 把結果轉換
print(golden_state_warriors.values()) # 用 list 把結果轉換

out:
21
dict_keys(['is_on_winning_streak', 'wins', 'team_name', 'win_percentage', 'losses']) dict_values([True, 21, '金州勇士隊', 0.84, 4])

ndarray
import numpy as np

print(np.zeros(6)) # 六個元素均為零的 1d array
print(np.arange(11)) # 十一個元素為 0 到 10 的 1d array
print(np.arange(1, 11)) # 十個元素為 1 到 10 的 1d array
print(np.arange(10).astype(np.str)) # 利用 astype() 方法轉換為文字 
print(np.arange(10).reshape(2, 5)) # 利用 reshape() 轉換為矩陣
print(np.arange(10).reshape(2, 5).T) # 利用 T 屬性轉置
print(np.random.normal(size = 10)) # 生成 10 組標準常態分配(平均值為 0,標準差為 1 的常態分配)隨機變數
print(np.random.uniform(size = 10)) # 生成 10 組介於 0 與 1 之間均勻分配隨機變數

out:
[ 0. 0. 0. 0. 0. 0.]
[ 0 1 2 3 4 5 6 7 8 9 10] 
[ 1 2 3 4 5 6 7 8 9 10] 
['0' '1' '2' '3' '4' '5' '6' '7' '8' '9'] 
[[0 1 2 3 4] [5 6 7 8 9]] 
[[0 5] [1 6] [2 7] [3 8] [4 9]] 
[-1.54011452 0.01713279 -0.03278685 1.4184904 1.75206569 -1.14644167 1.912005 -0.41178504 0.11401443 1.28097786] 
[ 0.12950068 0.55311978 0.18856714 0.59106765 0.21379646 0.010011 0.88442601 0.11328004 0.32626053 0.46299239]

data frame
import pandas as pd

name = ["蒙其·D·魯夫", "羅羅亞·索隆", "娜美", "騙人布", "賓什莫克·香吉士", "多尼多尼·喬巴", "妮可·羅賓", "佛朗基", "布魯克"]
age = [19, 21, 20, 19, 21, 17, 30, 36, 90]

# 建立 dict
straw_hat_dict = {"name": name,
                  "age": age
}

# 建立 data frame
straw_hat_df = pd.DataFrame(straw_hat_dict)

# 刪除觀測值或欄位
straw_hat_df.drop(0, axis = 0)
straw_hat_df.drop(1, axis = 1)

# 選擇觀測值或欄位
straw_hat_df.ix[0, :]
straw_hat_df.ix[:, 0]
straw_hat_df.ix[0, 0]

# 透過布林值篩選
filter = straw_hat_df.age >= 30
straw_hat_df[filter]
filter = straw_hat_df.age < 30
filter_2 = straw_hat_df.name == "蒙其·D·魯夫"
straw_hat_df[filter & filter_2]

查詢
在 Jupyter Notebook 中以 tab 鍵查詢
以 dir() 函數查詢=> $ dit()
官方文件與 Google








2017年1月14日 星期六

函數

內建函數1
Python 的內建函數(generic functions)
使用 help() 查詢文件
使用 type() 函數來觀察變數類型

內建函數2
help(sorted)

out:
Help on built-in function sorted in module builtins: 
sorted(iterable, key=None, reverse=False) 
    Return a new list containing all items from the iterable in ascending order. 
    A custom key function can be supplied to customise the sort order, and the                   reverse flag can be set to request the result in descending order.

distances = [3, 5, 10, 21, 42.125]

# 應用函數
print(max(distances)) # 最長的距離
print(min(distances)) # 最短的距離
print(len(distances)) # 總共有幾個距離
print(sorted(distances, reverse = True)) # 遞減排序


自訂函數1

自訂函數的結構

def function_name(輸入, 參數 1, 參數 2, ...):
    '''
    Docstrings # 說明 
    '''
    # 做些什麼事 
    return 結果

自訂函數2

import math # 要使用 pi 得引入套件 math

# 定義自訂函數 
def circle_calculate(radius, area = True): 
    '依據輸入的半徑與 area 參數計算圓形的面積或周長' # 單行的 docstring 
    circle_area = math.pi * radius**2 
    circle_circum = 2 * math.pi * radius 
    if (area == True): 
        return circle_area 
    else: 
        return circle_circum 

# 呼叫自訂函數 
help(circle_calculate) # 查詢自訂函數 
my_radius = 3 print(circle_calculate(my_radius)) # 預設回傳面積 print(circle_calculate(my_radius, area = False)) # 指定參數回傳周長

自訂函數3
在 return 後面將多個值用逗號 , 隔開就會回傳一個 tuple

import math # 要使用 pi 得引入套件 math  

# 定義自訂函數 
def circle_calculate(radius): 
    '依據輸入的半徑同時計算並回傳圓形的面積或周長' # 單行的 docstring 
    circle_area = math.pi * radius**2 
    circle_circum = 2 * math.pi * radius 
    return circle_area, circle_circum 

# 呼叫自訂函數 
my_radius = 3 
print(circle_calculate(my_radius))

自訂函數4
交換排序法(exchange sorting)
import random # 呼叫函數時使用隨機整數

# 定義自訂函數
def exchange_sort(input_list, reverse = False):
    ''' # 多行的 docstrings
    依據輸入的 list 與 reverse 參數排序 list 中的數字後回傳。
    reverse 參數預設為 False 遞增排序,可以修改為 True 遞減排序。
    '''
    input_list_cloned = input_list
    # 遞增排序
    if reverse == False:
        for i in range(0, len(input_list) - 1):
            for j in range(i+1, len(input_list)):
                # 如果前一個數字比後一個數字大則交換位置
                if input_list_cloned[i] > input_list_cloned[j]:
                    temp = input_list_cloned[i]
                    input_list_cloned[i] = input_list_cloned[j]
                    input_list_cloned[j] = temp
    # 遞減排序
    else:
        for i in range(0, len(input_list) - 1):
            for j in range(i+1, len(input_list)):
                # 如果前一個數字比後一個數字小則交換位置
                if input_list_cloned[i] < input_list_cloned[j]:
                    temp = input_list_cloned[i]
                    input_list_cloned[i] = input_list_cloned[j]
                    input_list_cloned[j] = temp
    return input_list_cloned

#呼叫自訂函數
my_list = random.sample(range(0, 100), 10) #產生一組隨機數
print(my_list) #看看為排序前
print(exchange_sort(my_list)) #預設遞增排序
print(exchange_sort(my_list, reverse = True)) #指定參數遞減排序


巢狀函數

在函數裡面嵌入函數
舉例來說一個計算平均數的函數裡面應該要包含兩個函數:
一個是計算總和的函數 my_sum()
一個是計算個數的函數 my_length()

# 定義自訂函數 
def my_mean(input_list): 
  '計算平均數' # docstrings 
  def my_sum(input_list): 
    '計算總和' 
    temp_sum = 0 
    for i in input_list: 
      temp_sum += i 
    return temp_sum 
  def my_length(input_list): 
    '計算個數' 
    temp_length = 0 
    for i in input_list: 
      temp_length += 1 
    return temp_length 
  return my_sum(input_list) / my_length(input_list) 

# 呼叫自訂函數 
one_to_10 = range(1, 11) 
print(my_mean(one_to_10))


錯誤處理
Python 使用 try - except 的語法結構進行錯誤處理
import math # 要使用 pi 得引入套件 math  

# 定義自訂函數 
def circle_calculate(radius): 
  '依據輸入的半徑同時計算並回傳圓形的面積或周長' # 單行的 docstring 
  try: 
    circle_area = math.pi * radius**2 
    circle_circum = 2 * math.pi * radius 
    return circle_area, circle_circum 
  except: 
    print("請輸入數值。") 

# 呼叫自訂函數 
my_radius = "3" 
circle_calculate(my_radius)

作業二(temporary)

import math
def my_sd_function(numbers):
  '自定的標準差函數,請輸入一個數列'
  N = len(numbers)
  sumation = 0
  for i in numbers:
    sumation += number
  mu = sumation / N
  for j in numbers:
    another_sumation += (J-mu)**2
  return math.sqrt(another_sumation / N)

my_list = range(1, 6) 
print(my_sd_function(my_list))



















流程控制

if-else
Python 沒有像是 switch 或者 case 的分支結構
透過 if-else 的結構創造程式的分支
整數除以 2 的餘數只會有兩種答案

number = list(range(1, 11))
for i in number:
    if (i % 2 == 0):
        print(i, "是偶數")
    else:
        print(i, "是奇數")

if-elif-else
number = list(range(1,11))
for i in number:
    if (i % 3 == 0):
        print(i, "可以被 3 整除")
    elif (i % 3 ==1):
        print(i, "除以 3 餘數是 1")
    else:
        print(i, "除以 3 餘數是 2")

break
ages = [19, 21, 20, 19, 21, 17, 30, 36, 90]
for age in ages:
    if (age > 30):
        break
    else:
        print(age)

print("---")
print(age)

continue
ages = [19, 21, 20, 19, 21, 17, 30, 36, 90]
for age in ages:
    if (age > 30):
        continue
    else:
        print(age)

print("---")
print(age)














迴圈

for 迴圈
range
one_to_hundred_list = range(1, 101)
print(list(one_to_hundred_list))
summation = 0

out:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]

索引值從1到100

不帶索引值的寫法
number = range(1, 101)
summation = 0

for number in number:
    summation += number

print(summation)

out:
5050

len
number = range(1, 101) 
length = len(number) 
print(length)
print(list(range(length)))

out:
100 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]

帶索引值的寫法
number = range(1, 101)
summation = 0
for i in range(len(number)):
    summation += number[i]

print(summation)
print(i)

out:
5050
99

while 迴圈
number = range(1, 101)
summation = 0
i = 0
while i < len(number):
    summation += number[i]
    i += 1

print(summation)
print(i)

無限迴圈
while True


while 迴圈停止寫法
number = range(1, 101)
summation = 0
i = 0
while(i < len(number)):
    i += 1

print(i)


















2017年1月12日 星期四

PGI on MAC

Download
http://www.pgroup.com/products/community.htm

zsh: command not found: pgfortran
$ ulimit -s unlimited
$ PATH=/opt/pgi/osx86-64/16.10/bin:$PATH; export PATH

2017年1月8日 星期日

資料結構2

pandas data frame
還記得 dict 這個資料結構嗎?
將一個 dict 的資料結構轉換為 data frame 是最方便的方法

import pandas as pd # 引用套件並縮寫為 
pd name = ["Monkey D. Luffy", "Roronoa Zoro", "Nami", "Usopp", "Vinsmoke Sanji", "Tony Tony Chopper", "Nico Robin", "Franky", "Brook"] 
age = [19, 21, 20, 19, 21, 17, 30, 36, 90] 
straw_hat_dict = {"name": name, "age": age }
straw_hat_dict_df = pd.DataFrame(straw_hat_dict)
print(type(straw_hat_dict_df))
print(straw_hat_dict_df.dtypes)
straw_hat_dict_df

out:
<class 'pandas.core.frame.DataFrame'>
age      int64
name    object
dtype: object
agename
019Monkey D. Luffy
121Roronoa Zoro
220Nami
319Usopp
421Vinsmoke Sanji
517Tony Tony Chopper
630Nico Robin
736Franky
890Brook
ps. 索引值起始是0

包含多種資料類型,不會像 ndarray 僅容納單一資料類型

import pandas as pd # 引用套件並縮寫為 pd

name = ["Monkey D. Luffy", "Roronoa Zoro", "Nami", "Usopp", "Vinsmoke Sanji", "Tony Tony Chopper", "Nico Robin", "Franky", "Brook"]
age = [19, 21, 20, 19, 21, 17, 30, 36, 90]
is_male = [True, True, False, True, True, True, False, True, True]

straw_hat_dict = {"name": name,
                  "age": age,
                  "is_male": is_male
}

straw_hat_df = pd.DataFrame(straw_hat_dict)

print(straw_hat_df.ix[0, :]) # 選第一個觀測值
print("---")
print(straw_hat_df.ix[:, "name"]) # 選第一欄
print("---")
print(straw_hat_df.ix[0, "name"]) # 選第一個觀測值的第一欄
print("---")
straw_hat_df

out:
age 19 i
s_male True name Monkey D. Luffy 
Name: 0, dtype: object --- 0 Monkey D. Luffy 1 Roronoa Zoro 2 Nami 3 Usopp 4 Vinsmoke Sanji 5 Tony Tony Chopper 6 Nico Robin 7 Franky 8 Brook Name: name, dtype: object --- Monkey D. Luffy ---
Out[46]:
ageis_malename
019TrueMonkey D. Luffy
121TrueRoronoa Zoro
220FalseNami
319TrueUsopp
421TrueVinsmoke Sanji
517TrueTony Tony Chopper
630FalseNico Robin
736TrueFranky
890TrueBrook

import pandas as pd # 引用套件並縮寫為 pd


name = ["Monkey D. Luffy", "Roronoa Zoro", "Nami", "Usopp", "Vinsmoke Sanji", "Tony Tony Chopper", "Nico Robin", "Franky", "Brook"]
age = [19, 21, 20, 19, 21, 17, 30, 36, 90]
is_male = [True, True, False, True, True, True, False, True, True]


straw_hat_dict = {"name": name,
"age": age,
"is_male": is_male
}


straw_hat_df = pd.DataFrame(straw_hat_dict)


filter_gender = straw_hat_df.ix[:, "is_male"] <= False
filter_age = straw_hat_df.ix[:, "age"] <= 30
straw_hat_df[filter_gender & filter_age]

out:
ageis_malename
220FalseNami
630FalseNico Robin
data frame 的概觀

import pandas as pd # 引用套件並縮寫為 pd

name = ["Monkey D. Luffy", "Roronoa Zoro", "Nami", "Usopp", "Vinsmoke Sanji", "Tony Tony Chopper", "Nico Robin", "Franky", "Brook"]
age = [19, 21, 20, 19, 21, 17, 30, 36, 90]
is_male = [True, True, False, True, True, True, False, True, True]

straw_hat_dict = {"name": name,
                  "age": age,
                  "is_male": is_male
}

straw_hat_df = pd.DataFrame(straw_hat_dict)


print(straw_hat_df.shape) # 回傳列數與欄數
print("---")
print(straw_hat_df.describe()) # 回傳描述性統計
print("---")
print(straw_hat_df.head(3)) # 回傳前三筆觀測值
print("---")
print(straw_hat_df.tail(3)) # 回傳後三筆觀測值
print("---")
print(straw_hat_df.columns) # 回傳欄位名稱
print("---")
print(straw_hat_df.index) # 回傳索引值



資料結構1

方法一
nba_div_1 = "大西洋組"
nba_div_2 = "中央組" 
nba_div_3 = "東南組" 
nba_div_4 = "西北組" 
nba_div_5 = "太平洋組"
nba_div_6 = "西南組"
方法二
nba_divs = ["大西洋組", "中央組", "東南組", "西北組", "太平洋組", "西南組"]

print(nba_divs[0])
print(nba_divs[1])

list
# as of 2016-12-13
team_name = "金州勇士隊" 
wins = 21 
losses = 4 
win_percentage = 0.84 
is_on_winning_streak = True 
golden_state_warriors = [team_name, wins, losses, win_percentage, is_on_winning_streak]

print(type(golden_state_warriors))
print(type(golden_state_warriors[0]))

tuple
nba_divs_tuple 不能做新增(.insert)或修改

dic
# as of 2016-12-13
team_name = "金州勇士隊"
wins = 21 
losses = 4 
win_percentage = 0.84 
is_on_winning_streak = True 

golden_state_warriors = { "team_name": team_name, "wins": wins, "losses": losses, "win_percentage": win_percentage, "is_on_winning_streak": is_on_winning_streak }

type(golden_state_warriors["team_name"])

ndarray
1. Python 的 list 無法使用 element-wise 運算

import numpy # 引入 numpy 套件

km_list = [21, 42.195]
km_array = numpy.array(km_list)
print(km_array)
print(type(km_array))
km_to_mile = 0.621371192
mile_array = km_array * km_to_mile
print(mile_array)

2. ndarray 只能容許一個資料類型
同時儲存有數值,布林值,會被自動轉換為數值
同時儲存有數值,布林值與文字,會被自動轉換為文字

import numpy as np

my_list = [1, True]
#my_list = [1, True, "False"]
my_np_array = np.array(my_list)
print(type(my_list[1]))
print(type(my_np_array[1]))
print(my_np_array.dtype)

3. ndarray 可以建立矩陣

import numpy as np 
my_np_array = np.array([1, 2, 3, 4]) 
print(my_np_array) 
print(my_np_array ** 2) 
print("---") # 分隔一下 
my_2d_array = np.array([[1, 3], [2, 4]]) 
print(my_2d_array) 
print(my_2d_array ** 2)

4. 選擇 ndarray 的元素
用索引值選擇

import numpy as np
my_np_array = np.array([1, 2, 3, 4]) 
print(my_np_array[0]) 
my_2d_array = np.array([[1, 3], [2, 4]]) 
print(my_2d_array[1, 1])

用布林值選擇
import numpy as np


my_np_array = np.array([1, 2, 3, 4])
filter = my_np_array >= 3
filter

out: array([False, False, True, True], dtype=bool)

5. 了解外觀的屬性
.size
.shape

import numpy as np
my_np_array = np.array([1, 2, 3, 4]) 
print(my_np_array.size) 
print(my_np_array.shape) 
print("---") # 分隔一下 my_2d_array = np.array([[1, 3], [2, 4]]) 
print(my_2d_array.size) 
print(my_2d_array.shape)










2017年1月7日 星期六

Python 開發環境

1. 安裝 Anaconda
https://www.continuum.io/downloads

如果不用Anaconda的話也可以使用pip
缺點就是要自己更新套件
Unix-like
$ python3 -m pip install -U 套件名稱
Windows
$ py -3 -m pip install -U 套件名稱

2. 開 jupyter notebook
$ jupyter notebook

如果用$ conda remove _nb_ext_conf
雖然可以把 kernel 刪除讓 jupyter 網頁上可以顯示 python3 的環境
但同時也會把 sklearn 一併刪除
造成模組無法呼叫

如果發現不能用 zsh 在終端機呼叫 conda 指令的話
$ vi ~/.zshrc
$ export PATH="/Users/chiustin/anaconda/bin:$PATH"

如果 conda update anaconda 無法執行的話
$ conda info (check "conda-build version")
$ conda install conda-build

3. 安裝 git 和申請 Github
https://git-scm.com/download/win
OS X 內建 Git,不需要進行安裝
https://github.com/

4. 設定 Git
打開 Git Bash 告訴 Git 帳戶與電子信箱
$ git config --global user.name "YOUR NAME"
$ git config --global user.email "YOUR EMAIL ADDRESS"

5. 建立一個專案
至 Github 建立 repository 複製網址
打開 Git Bash
$ cd ~/Desktop
$ git clone "網址"

6. 啟動 Jupyter Notebook
切換到想要的資料夾路徑下(使用 cd 指令)
$ jupyter notebook

7. 寫一個code
開另一個command line
$ comd+d
$ vi hello_world.py
$ print("Hello World!")
$ wd

8. 將程式碼推到遠端
同時在開啟Jupyter Notebook的command line
$ Ctrl + C
打開 Git Bash:
$ git add . 
$ git commit -m "first commit" 
$ git push
依照提示輸入帳戶與密碼
至Github 的 repository 查看是否成功

進階
使用 Octopress 寫 Blog
http://blog.jex.tw/blog/2015/03/24/octopress/
book
python data visualization cookbook