機械学習のための Python (7 日間のミニコース)
機械学習のための Python 短期集中コース。
7 日間でコア Python を学びます。
Python は素晴らしいプログラミング言語です。機械学習プロジェクトで広く使用されているだけでなく、システム ツール、Web プロジェクト、その他多くのプロジェクトでもその存在を見つけることができます。 Python はそのシンプルさで有名なので、優れたスキルを持っていれば作業をより効率的に行うことができます。アイデアをより早く試すことができます。アイデアを Python の簡潔なコードで表現することもできます。
実務者として、言語がどのように構築されているかを知る必要はありませんが、言語がさまざまなタスクに役立つことを知っておく必要があります。 Python コードがどれだけ簡潔であるか、またそのライブラリの関数がどれだけのことを実行できるかがわかります。
この短期集中コースでは、7 日間の演習を通じて、いくつかの一般的な Python テクニックを学びます。
これは大きくて重要な投稿です。ブックマークしておくといいかもしれません。
始めましょう。
この短期集中コースは誰のためのものですか?
始める前に、今いる場所が正しいことを確認してください。
このコースは、プログラミングの知識がある開発者を対象としています。もしかしたら、別の言語を知っているか、Python で数行のコードを記述して簡単なことを実行できるかもしれません。
このコースのレッスンでは、あなたについて次のようなことを前提としています。
- あなたは基本的な Python の使い方を理解しています。
- 変数、配列、ループ、関数などの基本的なプログラミング概念を理解している。
- Python はコマンド ラインまたは IDE 内で操作できます。
次のような必要はありません。
- スタープログラマー
- Python の専門家
この短期集中コースは、初心者プログラマーから Python で快適にコーディングできるエキスパートに変身するのに役立ちます。
この短期集中コースは、動作する Python 3.7 環境がインストールされていることを前提としています。環境に関するサポートが必要な場合は、次のステップバイステップのチュートリアルに従ってください。
- Anaconda を使用した機械学習用に Python 環境をセットアップする方法
短期集中コースの概要
この短期集中コースは 7 つのレッスンに分かれています。
1 日に 1 つのレッスンを完了する (推奨) ことも、1 日ですべてのレッスンを完了する (ハードコア) こともできます。それは本当にあなたが使える時間とあなたの熱意のレベルによって異なります。
以下は、Python を使い始めて生産性を高めるための 7 つのレッスンのリストです。
- レッスン 01: リストの操作
- レッスン 02: 辞書
- レッスン 03: タプル
- レッスン 04: 文字列
- レッスン 05: リストの理解
- レッスン 06: 列挙して圧縮する
- レッスン 07: マッピング、フィルター、リデュース
各レッスンには 5 分から最大 30 分かかります。時間をかけて自分のペースでレッスンを完了してください。質問したり、オンラインのコメントに結果を投稿したりできます。
レッスンでは、あなたが外に出て、物事のやり方を見つけることが期待されるかもしれません。このガイドはヒントを提供しますが、各レッスンのポイントの一部は、Python のアルゴリズムと最高のツールに関するヘルプを探すにはどこに行けばよいかを学習することです。
結果をコメントに投稿してください;応援するよ!
ちょっと待ってください。あきらめないで。
レッスン 01: リストの操作
このレッスンでは、Python の基本的なデータ構造であるリストについて学びます。
他のプログラミング言語には配列があります。 Python で対応するのはリストです。 Python リストでは、格納する要素の数に制限がありません。いつでも要素を追加でき、サイズは自動的に拡張されます。 Python リストでは、要素が同じ型である必要もありません。さまざまな要素をリストに組み合わせて組み合わせることができます。
以下では、いくつかの整数のリストを作成し、それに文字列を追加します。
x = [1, 2, 3]
x.append("that's all")
Python リストにはゼロインデックスが付けられます。つまり、上記のリストの最初の要素を取得するには、次のようにします。
print(x[0])
これにより、1
が画面に出力されます。
Python リストでは、負のインデックスが要素を後ろから数えることを意味することを許可します。したがって、上記のリストの最後の要素を出力する方法は次のとおりです。
print(x[-1])
Python には、リストの一部を検索するための便利な構文もあります。最後の 2 つの要素を出力するには、次のようにします。
print(x[-2:])
通常、スライス構文は start:end
であり、最後は結果に含まれません。省略した場合、デフォルトは最初の要素が開始点となり、リスト全体の末尾以降の要素が終了点となります。スライス構文を使用して ステップを作成することもできます。」たとえば、偶数と奇数を抽出する方法は次のとおりです。
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
odd = x[::2]
even = x[1::2]
print(odd)
print(even)
あなたのタスク
1 ~ 10 のリストから奇数を取得する上記の例では、ステップ サイズを -2
にしてリストを逆方向に進めることができます。スライス構文を使用して [9,7,5,3,1]
を出力するにはどうすればよいですか? [7,5,3]
はどうでしょうか?
以下のコメント欄に答えを投稿してください。あなたが何を思いつくかぜひ見てみたいです。
次のレッスンでは、Python 辞書について学びます。
レッスン 02: 辞書
このレッスンでは、Python によるマッピングの保存方法を学習します。
Perl と同様に、連想配列も Python のネイティブ データ構造です。それは辞書または辞書と呼ばれます。 Python では、リストには角括弧 []
を使用し、辞書には中括弧 {}
を使用します。 Python dict はキーと値のマッピングに使用されますが、キーは数値や文字列などハッシュ可能である必要があります。したがって、次のことができます。
price = {
"apple": 1.5,
"orange": 1.25,
"banana": 0.5
}
print("apple costs $", price["apple"])
キーと値のマッピングを辞書に追加することは、リストにインデックスを付けることと似ています。
price["lemon"] = 0.6
print("lemon costs $", price["lemon"])
\codetext{in} 演算子を使用して、キーが dict 内にあるかどうかを確認できます。次に例を示します。
if "strawberry" in price:
print("strawberry costs $", price["strawberry"])
else:
# if price is not found, assume $1
print("strawberry costs $1")
しかし、Python dict では、キーが見つからない場合に \codetext{get()} 関数を使用してデフォルト値を与えることができます。
print("strawberry costs $", price.get("strawberry", 1))
しかし実際には、\codetext{get()} にデフォルトを指定する必要はありません。省略した場合は \codetext{None} が返されます。例えば:
print("strawberry costs $", price.get("strawberry"))
それは生産します
strawberry costs $ None
Python 辞書はキーと値のマッピングであるため、次を使用してキーのみまたは値のみを抽出できます。
fruits = list(price.keys())
numbers = list(price.values())
print(fruits)
print(numbers)
list()
を使用して、印刷を容易にするためにキーまたは値をリストに変換しました。
%
リストを操作するもう 1 つの方法は、items() を使用することです。
関数。その結果は、キーと値のペアになります。
pairs = list(price.items())
print(pairs)
これは次のように出力されます:
[('apple', 1.5), ('orange', 1.25), ('banana', 0.5), ('lemon', 0.6)]
これらはリスト内のペアであるため、リスト操作構文を使用して 2 つの辞書の項目を結合し、結合された辞書を生成できます。以下は例です。
price1 = {
"apple": 1.5,
"orange": 1.25,
"strawberry": 1.0
}
price2 = {
"banana": 0.5
}
pairs1 = list(price1.items())
pairs2 = list(price2.items())
price = dict(pairs1 + pairs2)
print(price)
これにより以下が出力されます:
{'apple': 1.5, 'orange': 1.25, 'strawberry': 1.0, 'banana': 0.5}
あなたのタスク
Python のバージョンによっては、上記の最後の例の構文が簡略化される場合があります。
price = price1 | price2
price = {**price1, **price2}
最後の例と同じ結果を再現できるかどうか、インストールをチェックしてください。
次のレッスンでは、タプルを読み取り専用リストとして発見します。
レッスン 03: タプル
このレッスンでは、読み取り専用のデータ構造としてのタプルを学習します。
Python には、混合データの配列のように動作するリストがあります。 Python タプルはリストによく似ていますが、作成後に変更することはできません。それは不変です。タプルの作成は、かっこ ()
を使用することを除いて、リストの作成と同じです。
x = (1, 2, 3)
リストの場合と同様に、最初の要素を x[0]
として参照できます。ただし、タプルは不変であるため、新しい値を x[0]
に割り当てることはできません。これを実行しようとすると、Python はタプルが項目の割り当てをサポートしていないという理由で TypeError をスローします。
タプルは、関数の複数の戻り値を表すのに便利です。たとえば、次の関数は値の倍数をタプルとして生成します。
def powers(n):
return n, n**2, n**3
x = powers(2)
print(x)
これにより、次のように出力されます。
(2, 4, 8)
これはタプルです。ただし、通常は次のような解凍構文を使用します。
itself, squared, cubed = powers(2)
実際、これは Python の強力な構文であり、1 行で複数の変数を割り当てることができます。例えば、
count, elements = 0, []
これにより、変数 count
が整数 0
に割り当てられ、変数 elements
が空のリストに割り当てられます。アンパック構文のため、これは 2 つの変数の値を交換するPython 的な方法です。
a, b = b, a
あなたのタスク
タプルのリストを考えてみましょう。
x = [("alpha", 0.5), ("gamma", 0.1), ("beta", 1.1), ("alpha", -3)]
sorted(x)
を使用してこのリストを並べ替えることができます。結果は何ですか?タプルの比較結果から、Python はどのタプルが他のタプルより小さいか大きいかをどのように理解するのでしょうか?タプル ("alpha", 0.5)
とタプル ("alpha", 0.5, 1)
はどちらが大きいですか?
以下のコメント欄に答えを投稿してください。あなたが何を思いつくかぜひ見てみたいです。
次のレッスンでは、Python 文字列について学びます。
レッスン 04: 文字列
このレッスンでは、Python での文字列の作成と使用について学びます。
文字列は、Python でテキストを保存する基本的な方法です。すべての Python 文字列は Unicode 文字列です。つまり、Unicode を含めることができます。例えば:
x = "Hello ????"
print(x)
スマイリーは、コード ポイント 0x1F600 の Unicode 文字です。 Python の文字列には多くの関数が付属しています。たとえば、次のコマンドを使用して、文字列が部分文字列で始まるか終わるかを確認できます。
if x.startswith("Hello"):
print("x starts with Hello")
if not x.endswith("World"):
print("x does not end with World")
次に、文字列に部分文字列が含まれているかどうかを確認するには、「in
」演算子を使用します。
if "ll" in x:
print("x contains double-l")
他にもたくさんあります。文字列を分割する split()
や、文字列全体を大文字に変換する upper()
などです。
Python 文字列の特別なプロパティの 1 つは暗黙的な連結です。以下のすべては文字列 "hello world"
を生成します。
x = "hel" \
"lo world"
x = "hello" " world"
x = ("hello "
"world")
規則として、Python は通常、行継続として \
を使用します。ただし、Python が 2 つの文字列が何も区切らずに一緒に配置されていると認識すると、文字列は連結されます。したがって、上記の最初の例は、"hel"
と "lo world"
を連結することになります。同様に、最後の例では 2 つの文字列が括弧内に配置されているため、それらが連結されています。
Python 文字列は、テンプレートを使用して作成することもできます。これは、print()
関数でよく見られます。たとえば、以下のすべては変数 y
に対して "hello world"
を生成します。
x = "world"
y = "hello %s" % x
y = "hello {}".format(x)
y = f"hello {x}"
あなたのタスク
このコードを実行してみてください。
coord = {"lat": 51.5072, "lon": -0.1276}
print("latitude %(lat)f, longitude %(lon)f" % coord)
print("latitude {lat}, longitude {lon}".format(**coord))
これは、辞書を使用してテンプレートを埋めることです。 1 つ目は %
構文を使用し、2 つ目は format 構文を使用します。上記のコードを変更して、小数点以下 2 桁のみを表示することはできますか?ヒント: https://docs.python.org/3/library/string.html をチェックしてください。
以下のコメント欄に答えを投稿してください。あなたが何を思いつくかぜひ見てみたいです。
次のレッスンでは、Python のリスト内包構文を学習します。
レッスン 05: リストの理解
このレッスンでは、リスト内包構文を使用してその場でリストを構築する方法を説明します。
有名な fizz-buzz 問題は、3 の倍数をすべて「fizz」に置き換え、5 の倍数をすべて「buzz」に置き換えて 1 から 100 を出力します。数値が 3 と 5 の倍数の場合は、「fizzbuzz」と出力します。これを行うには、for
ループといくつかの if
ステートメントを作成します。ただし、1 行で実行することもできます。
numbers = ["fizzbuzz" if n%15==0 else "fizz" if n%3==0 else "buzz" if n%5==0 else str(n)
for n in range(1,101)]
print("\n".join(numbers))
リスト内包構文を使用してリスト numbers
を設定します。構文はリストのように見えますが、中に for
が含まれています。キーワード for
の前に、リスト内の各要素がどのように作成されるかを定義します。
リストの内包はさらに複雑になる場合があります。たとえば、1 から 100 までの 3 の倍数をすべて生成する方法は次のとおりです。
mul3 = [n for n in range(1,101) if n%3 == 0]
これが、$10\times 10$の九九を出力する方法です。
table = [[m*n for n in range(1,11)] for m in range(1,11)]
for row in table:
print(row)
そして、これが文字列を結合する方法です。
directions = [a+b for a in ["north", "south", ""] for b in ["east", "west", ""] if not (a=="" and b=="")]
print(directions)
これは次のように出力されます:
['northeast', 'northwest', 'north', 'southeast', 'southwest', 'south', 'east', 'west']
あなたのタスク
Python には辞書内包もあります。構文は次のとおりです。
double = {n: 2*n for n in range(1,11)}
ここで、辞書内包表記を使用して、文字列 x
を次の文字列の長さ len(x)
にマップする辞書 mapping
を作成してみます。
keys = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"]
mapping = {...}
以下のコメント欄に答えを投稿してください。あなたが何を思いつくかぜひ見てみたいです。
次のレッスンでは、enumerate()
と zip()
という 2 つの非常に便利な Python 関数を学習します。
レッスン 06: 列挙と圧縮
このレッスンでは、enumerate()
関数と zip()
関数を学習します。
多くの場合、次のような for ループを作成していることがわかります。
x = ["alpha", "beta", "gamma", "delta"]
for n in range(len(x)):
print("{}: {}".format(n, x[n]))
ただし、ここではリスト x
にアクセスするためのインデックスとして使用するためだけに、ループ変数 n
が必要です。この場合、enumerate()
を使用して、ループの実行中にリストにインデックスを付けるように Python に依頼できます。
x = ["alpha", "beta", "gamma", "delta"]
for n,string in enumerate(x):
print("{}: {}".format(n, string))
enumerate()
の結果は、カウンター (デフォルトはゼロで始まります) とリストの要素のタプルを生成します。アンパック構文を使用して、これを 2 つの変数に設定します。
for ループを次のように使用すると、次のようになります。
x = ["blue", "red", "green", "yellow"]
y = ["cheese", "apple", "pea", "mustard"]
for n in range(len(x)):
print("{} {}".format(x[n], y[n]))
Python には、以下を助ける関数 zip()
があります。
x = ["blue", "red", "green", "yellow"]
y = ["cheese", "apple", "pea", "mustard"]
for a, b in zip(x, y):
print("{} {}".format(a, b))
zip()
関数はジッパーのようなもので、各入力リストから 1 つの要素を取り出して並べます。 zip()
には 3 つ以上のリストを指定できます。一致するすべての項目を生成します (つまり、最も短い入力リストの最後に到達すると停止します)。
あなたのタスク
Python プログラムでは非常に一般的ですが、これを行う場合があります。
results = []
for n in range(1, 11):
squared, cubed = n**2, n**3
results.append([n, squared, cubed])
次に、zip()
を使用して、1 から 10 のリスト、それらの 2 乗、およびそれらの 3 乗を取得できます (results の前にある
引数内の ):*
に注意してください
numbers, squares, cubes = zip(*results)
これを試してみてください。 数字
、正方形
、立方体
を再結合して結果
に戻すことはできますか?ヒント: zip()
を使用してください。
次のレッスンでは、さらに 3 つの Python 関数、map()
、filter()
、および reduce()
を学習します。
レッスン 07: マップ、フィルター、リデュース
このレッスンでは、Python 関数 map()
、filter()
、および reduce()
を学習します。
これら 3 つの関数の名前は、関数プログラミング パラダイムに由来しています。簡単に言うと、 map()
は何らかの関数を使用してリストの要素を変換し、 filter()
は特定の基準に基づいて要素をリストに絞り込むことです。リスト内包を学習した場合、それらはリスト内包の別の方法にすぎません。
以前に見た例を考えてみましょう。
def fizzbuzz(n):
if n%15 == 0:
return "fizzbuzz"
if n%3 == 0:
return "fizz"
if n%5 == 0:
return "buzz"
return str(n)
numbers = map(fizzbuzz, range(1,101))
print("\n".join(numbers))
ここでは関数が定義されており、map()
はその関数を最初の引数として使用し、リストを 2 番目の引数として使用します。リストから各要素を取得し、提供された関数を使用して変換します。
filter()
の使用も同様です。
def multiple3(n):
return n % 3 == 0
mul3 = filter(multiple3, range(1,101))
print(list(mul3))
それが適切な場合は、戻り値を map()
から filter()
に渡すことも、その逆に渡すこともできます。
リスト内包表記を記述する別の方法として、map()
と filter()
を検討することもできます (ロジックがモジュール化されているため読みやすい場合があります)。 reduce()
関数はリスト内包表記に置き換えることはできません。リストから要素をスキャンし、関数を使用して要素を結合します。
Python には max()
関数が組み込まれていますが、同じ目的で reduce()
を使用できます。 reduce()
はモジュール functools
の関数であることに注意してください。
from functools import reduce
def maximum(a,b):
if a > b:
return a
else:
return b
x = [-3, 10, 2, 5, -6, 12, 0, 1]
max_x = reduce(maximum, x)
print(max_x)
デフォルトでは、reduce()
は最初の 2 つの要素を指定された関数に渡し、次に結果が 3 番目の要素とともに再び関数に渡され、入力リストがなくなるまで同様に繰り返されます。ただし、reduce()
を呼び出す別の方法もあります。
x = [-3, 10, 2, 5, -6, 12, 0, 1]
max_x = reduce(maximum, x, -float("inf"))
print(max_x)
この結果は同じですが、関数の最初の呼び出しではデフォルト値 (この場合は負の無限大である -float("inf")
) とリストの最初の要素が使用されます。次に、その結果とリストの 2 番目の要素を使用し、以下同様に使用します。以下の演習のように、場合によってはデフォルト値を指定することが適切です。
あなたのタスク
ビットマップを整数に変換する方法を考えてみましょう。リスト [6,2,0,3]
が提供されている場合、そのリストをどのビットをアサートするかとして考慮する必要があり、結果は 2 進数で 1001101、または 10 進数で 77 になる必要があります。この場合、ビット 0 は最下位ビットまたは右端ビットとして定義されます。
これを行うにはreduceを使用し、77を出力します。
def setbit(bitmap, bit):
return bitmap | (2**bit)
assertbits = [6, 2, 0, 3]
bitmap = reduce(setbit, assertbits, ???)
print(bitmap)
上の ???
は何でしょうか?なぜ?
以下のコメント欄に答えを投稿してください。あなたが何を思いつくかぜひ見てみたいです。
これが最後のレッスンでした。
最後です!
(どこまで来たか)
成功しましたね。よくやった!
少し時間を取って、これまでの道のりを振り返ってください。
あなたは次のことを発見しました:
- Python リストとスライス構文
- Python 辞書、その使い方、および 2 つの辞書を組み合わせる方法
- タプル、アンパック構文、およびそれを使用して変数を交換する方法
- 文字列 (テンプレートから新しい文字列を作成するさまざまな方法を含む)
- リストの内包表記
- 関数
enumerate()
およびzip()
の使用 map()
、filter()
、およびreduce()
の使用方法
まとめ
ミニコースはどうでしたか?
この短期集中コースは楽しかったですか?
何か質問はありますか?何か引っかかる点はありましたか
教えてください。以下にコメントを残してください。