Python入門

四則演算:+,-,*,/,()をつかってみよう。

例: 12+5, 4-3, 2*4, 3/5, (3+2)*3

In [1]:
2*3
Out[1]:
6
In [2]:
3/4
Out[2]:
0.75
In [3]:
3-5
Out[3]:
-2
In [4]:
4*(5-3)
Out[4]:
8
In [5]:
5**2
Out[5]:
25
In [6]:
4+5*2
Out[6]:
14

各自で入力してみよう

In [6]:

In [6]:

変数

変数xに2、変数yに3を代入し、x/yを計算した結果をzに代入
このように'='には右辺の値を左辺に代入するという意味がある

In [7]:
x=2
y=3
z=x/y

print関数を用いて、変数に代入した値を表示

In [8]:
print(z)
0.6666666666666666

orangeに120, appleに150を代入

In [9]:
orange=120
apple=150
In [10]:
print(orange)
120
In [11]:
print("オレンジの値段は",orange,"円です。")
オレンジの値段は 120 円です。
In [12]:
print("オレンジ2個とりんご4個の値段は",2*orange+4*apple,"円です。")
オレンジ2個とりんご4個の値段は 840 円です。

変数にテキストも代入できます。ただし、テキストは'か"で囲みます

In [13]:
name='石原'
month=3
day=27
print("私の名前は",name,"です。誕生日は",month,"月",day,"日です。")
私の名前は 石原 です。誕生日は 3 月 27 日です。

%whoで使用している変数、%whosで使用している変数のタイプや値を確認

In [14]:
%who
apple	 day	 month	 name	 orange	 x	 y	 z	 
In [15]:
%whos
Variable   Type     Data/Info
-----------------------------
apple      int      150
day        int      27
month      int      3
name       str      石原
orange     int      120
x          int      2
y          int      3
z          float    0.6666666666666666

intは整数型、floatは浮動小数点数型、strは文字列型

delを用いて使用している変数を削除

In [16]:
del orange
In [17]:
%who
apple	 day	 month	 name	 x	 y	 z	 

%resetで全ての変数を削除(本当に削除するのか確認されます)

In [18]:
%reset
Once deleted, variables cannot be recovered. Proceed (y/[n])? y
In [19]:
%who
Interactive namespace is empty.

リスト

Pythonには整形されたデータを効率的に扱うことを可能とする多くの機能とライブラリが用意されています.
リストは複数のデータの基本となるデータ構造です.

変数numsに複数の要素を持つリストを代入

In [20]:
nums=[1,2,3,4,4,5]

リストの要素の参照。先頭は0番、続いて1番、2番、、。末尾は-1で参照。

In [21]:
nums[0]
Out[21]:
1
In [22]:
nums[-1]
Out[22]:
5

2番から5番の手前(=4番)の要素までの参照

In [23]:
nums[2:5]
Out[23]:
[3, 4, 4]

:で全てを参照

In [24]:
nums[:]
Out[24]:
[1, 2, 3, 4, 4, 5]

リストの操作:pythonのリストにはいくつかのメソッドが用意されている

appendは要素をリストの末尾に追加するメソッド

In [25]:
nums.append(8)
In [26]:
nums
Out[26]:
[1, 2, 3, 4, 4, 5, 8]

指定した場所に要素を挿入

In [27]:
nums.insert(2,-4)
In [28]:
nums
Out[28]:
[1, 2, -4, 3, 4, 4, 5, 8]

指定した場所の要素を削除

In [29]:
nums.pop(2)
Out[29]:
-4
In [30]:
nums
Out[30]:
[1, 2, 3, 4, 4, 5, 8]
In [31]:
nums.count(4)
Out[31]:
2
In [32]:
1 in nums
Out[32]:
True
In [33]:
6 in nums
Out[33]:
False
In [34]:
nums.sort()
In [35]:
nums
Out[35]:
[1, 2, 3, 4, 4, 5, 8]

リストの要素数

In [36]:
len(nums)
Out[36]:
7

リストとリストの結合

In [37]:
num1=[1,2,3]
num2=[4,3,2]
In [38]:
num1+num2 #ベクトルの足し算のようにはならないことに注意
Out[38]:
[1, 2, 3, 4, 3, 2]

リストの繰り返し

In [39]:
num1*2 #ベクトルの定数倍のようにならないことに注意
Out[39]:
[1, 2, 3, 1, 2, 3]

リストのリスト

In [40]:
mat1=[[1,2],[3,4],[5,6]]
In [41]:
mat1[0]
Out[41]:
[1, 2]

→mat1の0番要素は[1,2]

In [42]:
mat2=[[1,2,3,4],[5,6,7,8],[9,10,11,12]]
In [43]:
mat2[1]
Out[43]:
[5, 6, 7, 8]
In [44]:
mat2[1][2]
Out[44]:
7

mat2の1番要素[5,6,7,8]の2番要素は7

In [45]:
mat2[1][0:2]
Out[45]:
[5, 6]

Numpyの活用

NumpyはPythonのライブラリの一つで、インポートして使います..
リストのデータをNumpyの配列として扱うことで、整形された複数のデータを高速に扱うための便利なメソッドが使えるようになります.

Numpy配列入門

In [46]:
import numpy as np
In [47]:
mat2=[[1,2,3,4],[5,6,7,8],[9,10,11,12]]

mat2をNumpyの配列に変換し、名前をamat2とします

In [48]:
amat2=np.array(mat2)

Numpyの配列では多くの便利なメソッドが使用可能になります。shapeはNumpy配列で使用可能になるメソッドの一つです

In [49]:
amat2.shape
Out[49]:
(3, 4)

→amat2の要素は3つあり、その各々が4つの要素をもつリスト

In [50]:
amat2
Out[50]:
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

amat2の0番の要素の抽出

In [51]:
amat2[0]
Out[51]:
array([1, 2, 3, 4])

amat2の各要素(=リスト)の0番の要素を抽出

In [52]:
amat2[:,0]
Out[52]:
array([1, 5, 9])

amat2の各要素(=リスト)の0番から2番の手前の要素までを抽出

In [53]:
amat2[:,0:2]
Out[53]:
array([[ 1,  2],
       [ 5,  6],
       [ 9, 10]])

amat2の各要素(=リスト)の0番と2番の要素を抽出

In [54]:
amat2[:,(0,2)]
Out[54]:
array([[ 1,  3],
       [ 5,  7],
       [ 9, 11]])

以上のような要素の抽出は普通のpythonのリストでは不可能。Numpyの配列の場合に可能

(参考1)多重入れ子のNumpy配列(上級者向)

In [55]:
amat3=np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
In [56]:
amat3
Out[56]:
array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[ 7,  8,  9],
        [10, 11, 12]]])
In [57]:
amat3.shape
Out[57]:
(2, 2, 3)

→amat3の要素は2つあり、その各々が2つの要素をもち、さらにその各々が3つの要素をもつ

amat3の0番要素

In [58]:
amat3[0]
Out[58]:
array([[1, 2, 3],
       [4, 5, 6]])

amat3の0番要素の1番要素

In [59]:
amat3[0,1]
Out[59]:
array([4, 5, 6])

amat3の1番要素の1番要素

In [60]:
amat3[1,1]
Out[60]:
array([10, 11, 12])

amat3の各要素の0番要素

In [61]:
amat3[:,0]
Out[61]:
array([[1, 2, 3],
       [7, 8, 9]])

amat3の各要素各要素の0番要素

In [62]:
amat3[:,:,0]
Out[62]:
array([[ 1,  4],
       [ 7, 10]])

(参考2)Numpy配列同士の演算

In [63]:
num1=[1,2,3]
num2=[2,3,2]
In [64]:
a_num1=np.array(num1)
a_num2=np.array(num2)
In [65]:
a_num1
Out[65]:
array([1, 2, 3])
In [66]:
a_num2
Out[66]:
array([2, 3, 2])

ベクトルの和

In [67]:
a_num1+a_num2
Out[67]:
array([3, 5, 5])

ベクトルのスカラー倍

In [68]:
a_num1*2
Out[68]:
array([2, 4, 6])

ベクトルとしての演算

In [69]:
a_num2-2*a_num1
Out[69]:
array([ 0, -1, -4])

ベクトルの内積

In [70]:
a_num1@a_num2
Out[70]:
14
In [71]:
a_num1.dot(a_num2)
Out[71]:
14

Pandasの活用

pandasをインポートすると外部の表データ(csvファイル)の読み込みが可能になります
エクセルなどの表計算ソフトで扱うような多様な配列データをPythonで扱うためのライブラリです。
Pandasで扱う多様なデータを高速に処理するための機能がNumpyで提供される、といった感じです。

pandasを用いた外部の表データ(csvファイル)の読み込み

In [72]:
import pandas as pd
In [73]:
dat0=pd.read_csv('/content/sazae.csv')
In [74]:
dat0
Out[74]:
名前 性別 年齢 身長
0 サザエ 0 24 159
1 マスオ 1 28 173
2 カツオ 1 11 143
3 ワカメ 0 9 133
4 タラオ 1 3 95
5 波平 1 54 178
6 フネ 0 52 158
In [75]:
type(dat0) # →dat0はpandasの特有のデータフレームオブジェクトであることがわかります
Out[75]:
pandas.core.frame.DataFrame

pandasのデータフレームオブジェクトはindexとcolumnsとvaluesで構成されています

In [76]:
dat0.index
Out[76]:
RangeIndex(start=0, stop=7, step=1)
In [77]:
dat0.columns
Out[77]:
Index(['名前', '性別', '年齢', '身長'], dtype='object')
In [78]:
dat0.values
Out[78]:
array([['サザエ', 0, 24, 159],
       ['マスオ', 1, 28, 173],
       ['カツオ', 1, 11, 143],
       ['ワカメ', 0, 9, 133],
       ['タラオ', 1, 3, 95],
       ['波平', 1, 54, 178],
       ['フネ', 0, 52, 158]], dtype=object)

Numpy配列に対するメソッドshapeと同様に、pandasのデータフレームオブジェクトに対してもshapeメソッドが使え、行数と列数の情報が得られます.

In [79]:
dat0.shape
Out[79]:
(7, 4)

headは最初の5行を表示するpandasのメソッド

In [80]:
dat0.head()
Out[80]:
名前 性別 年齢 身長
0 サザエ 0 24 159
1 マスオ 1 28 173
2 カツオ 1 11 143
3 ワカメ 0 9 133
4 タラオ 1 3 95

pandasのデータフレームを構成するvaluesはNumpyのオブジェクトです

In [81]:
dat0val=dat0.values
type(dat0val) # →dat0valはNumpyのオブジェクトとなっています
Out[81]:
numpy.ndarray

Numpyのメソッドshapeを用いて、データの形を調べます

In [82]:
dat0val.shape
Out[82]:
(7, 4)

'性別'データのみの取り出し. 以下の2つはどちらも同じ結果がyに代入される.

In [83]:
y=dat0.iloc[:,1].values
In [84]:
y=dat0.loc[:,'性別'].values

yのデータのタイプを確認します.→ Numpyの配列でることがわかります

In [85]:
type(y)
Out[85]:
numpy.ndarray

Numpyのメソッドshapeを用いてyのデータの形を確認します.→要素数が7のリストであることがわかります

In [86]:
y.shape
Out[86]:
(7,)

'名前'と'年齢'と'身長'の数字データの取り出し. 以下の2つはどちも同じ結果がXに代入される.

In [87]:
X=dat0.iloc[:,[0,2,3]].values
In [88]:
X=dat0.loc[:,['名前','年齢', '身長']].values

Xのデータのタイプを確認します.→ Numpyの配列でることがわかります

In [89]:
type(X)
Out[89]:
numpy.ndarray

Numpyのメソッドshapeを用いて Xのデータの形を確認します.

In [90]:
X.shape
Out[90]:
(7, 3)

→Xの要素数が7個であり,その各要素が3個の要素を持つリストであることがわかります

In [91]:
X
Out[91]:
array([['サザエ', 24, 159],
       ['マスオ', 28, 173],
       ['カツオ', 11, 143],
       ['ワカメ', 9, 133],
       ['タラオ', 3, 95],
       ['波平', 54, 178],
       ['フネ', 52, 158]], dtype=object)

Xのデータのうち、'性別'が1であるデータのみ取り出してX1に代入します

In [92]:
X1=X[y==1]
X1
Out[92]:
array([['マスオ', 28, 173],
       ['カツオ', 11, 143],
       ['タラオ', 3, 95],
       ['波平', 54, 178]], dtype=object)

X1から'年齢'と'身長'に該当する第1要素と第2要素のみを取り出すには次のようにします

In [93]:
X1[:,[1,2]]
Out[93]:
array([[28, 173],
       [11, 143],
       [3, 95],
       [54, 178]], dtype=object)

(参考)'名前'をインデックスとして読み込むことも可能

In [94]:
dat=pd.read_csv('/content/sazae.csv',index_col='名前')
In [95]:
dat
Out[95]:
性別 年齢 身長
名前
サザエ 0 24 159
マスオ 1 28 173
カツオ 1 11 143
ワカメ 0 9 133
タラオ 1 3 95
波平 1 54 178
フネ 0 52 158
In [96]:
type(dat)
Out[96]:
pandas.core.frame.DataFrame
In [97]:
dat.columns
Out[97]:
Index(['性別', '年齢', '身長'], dtype='object')
In [98]:
dat.index
Out[98]:
Index(['サザエ', 'マスオ', 'カツオ', 'ワカメ', 'タラオ', '波平', 'フネ'], dtype='object', name='名前')
In [99]:
dat.shape
Out[99]:
(7, 3)
In [100]:
dat.values
Out[100]:
array([[  0,  24, 159],
       [  1,  28, 173],
       [  1,  11, 143],
       [  0,   9, 133],
       [  1,   3,  95],
       [  1,  54, 178],
       [  0,  52, 158]])
In [101]:
type(dat.values)
Out[101]:
numpy.ndarray
In [102]:
dat.columns[0]
Out[102]:
'性別'

'性別'データのみの取り出し

In [103]:
dat.loc[:,'性別'].values
Out[103]:
array([0, 1, 1, 0, 1, 1, 0])
In [104]:
dat.iloc[:,0].values
Out[104]:
array([0, 1, 1, 0, 1, 1, 0])

'年齢'と'身長'の数字データの取り出し. 以下の4つはどれも同じ結果が得られる.
上の3つはpandasのオブジェクトから列を抽出してからNumpyのオブジェクトに変換
4つ目はNumpyオブジェクトに変換してから列の抽出を行なっている

In [ ]:
dat.iloc[:,[1,2]].values
In [ ]:
dat.loc[:,['年齢', '身長']].values
In [ ]:
dat[['年齢','身長']].values
In [108]:
dat.values[:,[1,2]]
Out[108]:
array([[ 24, 159],
       [ 28, 173],
       [ 11, 143],
       [  9, 133],
       [  3,  95],
       [ 54, 178],
       [ 52, 158]])