ウェッブ上の表を再構築

ウェッブサイトのいくつかあるテーブルから、最初のテーブルのインデックスと値だけを抽出して、Anaconda上で、またテーブルを組み立てる。

reモジュールのメソッドの引数に、正規表現を記述しようと思ってはみたけれど、正規表現に不慣れ、というか、使ったこともないため、エラいことになっていた。

暗中模索のなか、pandasを使ったところ、カンタンに出来てしまった。なーんだ、である。

import pandas as pd
url = 'https://bellcurve.jp/statistics/course/18766.html'
dfs = pd.read_html(url)

print(dfs[0])

# アウトプット
性別   度数
0  オス   60
1  メス   40
2  合計  100

(追記)
もっと、カンタンな方法があった。pandas、すげぇわ。
ウェッブサイト上の任意のテーブルをコピーし、以下の記述。これだけ〜

dfs2=table= pd.read_clipboard()
print(dfs2)

# アウトプット
性別   度数
0  オス   60
1  メス   40
2  合計  100

リストから最初の値w抽出する。

複数のリストから、最初の値(リストのキーとしては0番目の値)を抽出する記述を書いてみた。

1)
lst1 =[[1,2,3],[4,5,6],[7,8,9]]
lst2=lst1[0][0],lst1[1][0],lst1[2][0]
print(list(lst2))
[1, 4, 7]

ただ、この記述方法では、リストが数多くあった場合、
リスト名[0][0]、リスト名[1][0]、リスト名[2][0]….
というふうに、リストの数だけ、リストを並べていくことになってしまう。

こういう場合は、for文をつかっていこう。

2)
lst3=[]
for i in lst1:
lst3.append(i[0])

print(lst3)
[1, 4, 7]

内包表記をつかうと、こんなふうに書ける。

3)
lst4 = [n[0]for n in lst1]
print(lst4)
[1,4,7]

3)の記述は、teratailのLouis0616さんのアドバイスによる。

ぼくの書いた1)と比べると、なんとシンプルで美しいんだろう。

__init__

このへんの、わかりにくさも定説。

クラスの中に、初期化メソッド
__inti__
を作成することで、
インスタンスを作るさいに、値を保持することができる。

class Food:
    udon = 'うどん'  
    
    def curry():  
        print('カレー')
        
    def __init__(self,name): #インスタンス化に際して値を保持できる。
        self.name = name

 

Food.udon
>>うどん

Food.curry()
>>カレー

food = Food(‘牛丼’)
food.name
>>牛丼

self

pythonは、いっそ、「すべてがオブジェクトなのだ」と思ってしまいたい。

インスタンスも、もちろん、オブジェクトだ。

で、インスタンスがつくられるとき、インスタンスのなかに、じぶん自身がつくられる、というのが、とても分かりにくかったりする。

なにも、これは、ぼくだけでなく、ネットをチェックしてみると、同意見のひとが少なくないんだね。

まずは任意のクラスをつくり、インスタンス化のあと、わざと、エラーを出してみよう。

# クラスをつくる
class Food:
    def curry():
        print("インドカレー")

# インスタンスをつくる
food= Food()

#インスタンスからメソッドを呼び出す
food.curry()

#つぎのようなエラーメッセージがでる
----> 1 food.curry()
TypeError: curry() takes 0 positional arguments but 1 was given

 

food.curry( )は引数をとらない。けれど引数が与えられている。

引数が与えられている? なんだろう?

じつは…インスタンスが作られるとき、第一引数に自分自身が引数として与えられている、というんだなぁ…このへんは、ほーんとに、わかりずらい。

ま、良くわからないまま、クラス側のメソッドに引数を明示的に入れる、というんですねぇ。で、pythonでは、このさい、selfという文字をつかうことが慣習となっている。

オッケー。さきほどのコードを書きなおしてみようか。

# クラスをつくる
class Food:
    def curry(self):
        print("インドカレー")

# インスタンスをつくる
food= Food()

#インスタンスからメソッドを呼び出す
food.curry()

インドカレー

 

こんどはエラーにならない。

mesh grid

np.meshgridの働きをまとめておこう。

import numpy as np

x1=np.array([1,2,3])
x2=np.array([4,5,6])

X1,X2=np.meshgrid(x1,x2)

print(X1)
[[1,2,3]
 [1,2,3]
 [1,2,3]]

print(x2)
[[4,4,4]
 [5,5,5]
 [6,6,6]]

 

第一引数のリストが横に、一方、第二引数のリストが縦に配置される。リストの個数は、それぞれの値の数と対応しているようだ。

これを、使うことで、たとえばx1とx2すべてを足した値、あるいはすべてを掛けた値のリストを作ることができる。

def sum(X1,X2):
    return X1+X2

sum(X1,X2):
array([[5, 6, 7],
       [6, 7, 8],
       [7, 8, 9]])


def malti(X1,X2):
    return  X1*x2


array([[ 4,  8, 12],
       [ 5, 10, 15],
       [ 6, 12, 18]])

 

一昨日のブログで示した二乗和のグラフは、これを応用しているんだね。ほー。

 

論理ゲートをPythonで

ANDゲート、NANDゲート、ORゲートをpythonのクラスで書いてみた〜(XORゲートは、うまく行かず。出力エラーになってしまう)

import numpy as np

class Logic_gate:
    def __init__(self,x1,x2):
        self.x1=x1
        self.x2=x2
        
    def AND(self):
        x=np.array([self.x1,self.x2])
        w=np.array([0.5,0.5])
        b=-0.5
        y=np.sum(x*w)+b
        if y<=0:
            return 0
        else:
            return 1
    
    def NAND(self):
        x=np.array([self.x1,self.x2])
        w=np.array([-0.6,-0.6])
        b=0.8
        y=np.sum(x*w)+b
        if y<=0:
            return 0
        else:
            return 1
    
    def OR(self):
        x=np.array([self.x1,self.x2])
        w=np.array([0.5,0.5])
        b=-0.3
        y=np.sum(x*w)+b
        if y<=0:
            return 0
        else:
            return 1
    
    def XOR(self):
        s1=NAND(self.x1,self.x2)
        s2= OR(self.x1,self.x2)
        y=AND(s1,s2)
        return y
#AND回路の出力

resAND= Logic_gate(0,0)
resAND.AND()
0

resAND= Logic_gate(1,0)
resAND.AND()
0

resAND= Logic_gate(0,1)
resAND.AND()
0

resAND= Logic_gate(1,1)
resAND.AND()
1
#NAND回路の出力

resNAND= Logic_gate(0,0)
resNAND.NAND()
1

resNAND= Logic_gate(1,0)
resNAND.NAND()
1

resNAND= Logic_gate(0,1)
resNAND.NAND()
1

resNAND= Logic_gate(1,1)
resNAND.NAND()
0
#OR回路の出力

resOR=Logic_gate(0,0)
resOR.OR()
0

resOR=Logic_gate(1,0)
resOR.OR()
1

resOR=Logic_gate(0,1)
resOR.OR()
1

resOR=Logic_gate(1,1)
resOR.OR()
1

参考:「ゼロから作るDeepLearning」(斎藤康毅/オライリー・ジャパン)

with open( )

pythonのwith open( )について、まとめておこう。

このさいのopen( )は,ファイルを開くときの埋め込み関数。

閉じるときはclose( )関数を利用する。ただし、close( )関数を記述しないで、閉じてしまう場合が多々ある。

そうならないためにwith文を利用する。

じっさに記述してみようか。

//close( )関数を使った場合
path=’/Users/tsurumakifumiaki/test.ipynb’
f=open(path)
type(f)
f.close()

with open(path) as f:
print(type(f))