こんにちは,shun(@datasciencemore)です!!
今回は,ベクトルについて説明していきます.
pythonでは,numpyを使用するとベクトル計算ができるようになります.
目次
1.ベクトルの四則演算
ベクトルは基本,同じ長さであれば四則演算できます.
ちなみに四則演算というのは,足し算,引き算,掛け算,割り算のことです.
下図のようにvec_1というベクトルとvec_2というベクトルを足すと,同じ色の部分が足されて出力されます.
ベクトルの向きについて補足いたします.
前回はベクトルは横向きでしたが,今回は縦向きですね.
実はベクトルは縦向きのベクトルと横向きのベクトル,両方があります.
両方あるというか,どちらで考えてもよいといったほうが正確です.
どちらを使うかはその時次第で便利なほうを使用する感じです.
なので,縦ベクトルも横ベクトルも慣れてください.
四則演算のコードは以下のようになります.
1 2 3 |
# ベクトル vec_1 = np.array([1, 5, 8, 13, 4]) vec_2 = np.array([2, 3, 5, 10, 98]) |
1 2 |
# 足し算 vec_1 + vec_2 |
1 |
array([ 3, 8, 13, 23, 102]) |
1 2 |
# 引き算 vec_1 - vec_2 |
1 |
array([ -1, 2, 3, 3, -94]) |
1 2 |
# 掛け算 vec_1 * vec_2 |
1 |
array([ 2, 15, 40, 130, 392]) |
1 2 |
# 割り算 vec_1 / vec_2 |
1 |
array([0.5 , 1.66666667, 1.6 , 1.3 , 0.04081633]) |
慣れればそんなに難しくないですね!
2.ベクトルのブロードキャスト
前項で2つのベクトルを計算する際,基本,長さが同じである必要があると説明しました.
それでは,このようなベクトル同士は計算できるのでしょうか?
普通に考えると2番目のベクトルの長さが足りないので計算できないですよね.
ところが,実際にやってみると計算できます.
実は,2番目のベクトルはブロードキャストという機能を使って自動的に長さを調節しています.
どういうことかといいますと,足りない部分に対してブロードキャストすることで,この上のベクトルを使用して自動的に足りない部分を補完してくれるのです.
この機能は大変便利です.
ちなみにこの上のベクトルは,ただの数値でもOKです.
それではこんな感じで長さが2のベクトルを足そうとすると,どうなるでしょうか?
実はこれだとエラーとなります.
numpyでは,このように長さが1以外のベクトルについては混乱を避けるためブロードキャストしない仕様となっています.
Rだとこのようなベクトルも計算できたので,Rに慣れている人は注意してください.
コードは以下のとおりです.
1 2 3 4 |
# ベクトル vec_1 = np.array([1, 5, 8, 13]) vec_2 = np.array([2]) vec_2 = np.array([2, 3]) |
1 2 |
# ブロードキャスト vec_1 + vec_2 |
1 |
array([ 3, 7, 10, 15]) |
1 2 |
# 普通の数でもOK vec_1 + 2 |
1 |
array([ 3, 7, 10, 15]) |
1 2 |
# ブロードキャストできない vec_1 + vec_3 |
1 |
ValueError: operands could not be broadcast together with shapes (4,) (2,) |
3.ベクトルの要素抽出
ベクトルの要素抽出というのは,下の図のように全体のベクトルのうち,一部を抽出することです.
要素の位置を指定する方法は,全部で3つあります.
- インデックスで指定
- スライスで指定
- 論理値ベクトルで指定
これらのうち,①,②についてはリストと同じです.
①インデックスで指定
1 2 |
# インデックス 4を抽出 vec_1[4] |
1 |
4 |
②スライスで指定
1 2 |
# インデックス 1~3を抽出 vec_1[1:4] |
1 |
array([ 5, 8, 13]) |
①,②はリストと同様なので簡単ですね.
③論理値ベクトルで指定
リストと違い,ベクトルは論理値ベクトルで要素を抽出することができます.
論理値ベクトルというのは,bool型のベクトルのことです.
イメージはこのような感じです.
ベクトルに論理値ベクトルを指定すると,Trueに該当する所を抽出してくれます.
この例だと,Trueがインデックス0, 2, 3の位置にあるため,インデックス0, 2, 3に対応する要素を抽出してくれます.
1 2 |
# 論理値ベクトル vec_bool = np.array([True, False, True, True, False]) |
1 2 |
# 論理値ベクトルがTrueの所(インデックス 0, 2, 3)を抽出 vec_1[vec_bool] |
1 |
array([ 1, 8, 13]) |
これは,条件を満たした要素を抽出する場合に便利です.
1 2 |
# 5以上の要素を抽出 vec_1[vec_1 >= 5] |
1 |
array([ 5, 8, 13]) |
以下の処理で5以上の要素が抽出されます.
- vec >= 5の部分で,論理値ベクトル(FALSE, TRUE, TRUE, TRUE, FALSE)が返却される.
- 論理値ベクトル(FALSE, TRUE, TRUE, TRUE, FALSE)のTRUEの所が抽出される.
条件については,詳細に別記事にまとめる予定です.
今はなんとなく理解いただければOKです.
4.ベクトルの便利関数
numpyには便利な関数がいくつもあります.
その中で特によく使用する関数を以下に挙げます.
ここに示した関数は,ベクトルを入力とすることによって,指定した出力を算出してくれます.
1 2 |
# ベクトル vec_1 = np.array([1, 5, 8, 13, 4]) |
sum
1 2 |
# ベクトルの総和 np.sum(vec_1) |
1 |
31 |
average
1 2 |
# ベクトルの平均 np.average(vec_1) |
1 |
6.2 |
median
1 2 |
# ベクトルの中央値 np.median(vec_1) |
1 |
5.0 |
max
1 2 |
# ベクトルの最大値 np.max(vec_1) |
1 |
13 |
min
1 2 |
# ベクトルの最小値 np.min(vec_1) |
1 |
1 |
var
1 2 |
# ベクトルの分散 np.var(vec_1) |
1 |
20.7 |
std
1 2 |
# ベクトルの標準偏差 np.std(vec_1) |
1 |
4.069397989875161 |
関数を使用した応用例
関数を使用した応用例として論理値ベクトルでよく使用する処理を紹介します.
sumとaverageを使用することで論理値ベクトルのTrueの個数と割合を算出することができます.
なぜかというと論理値ベクトルに対しコンピュータは,Trueを1,Falseを0として認識しているからです.
1 2 |
# 論理値ベクトル vec_bool = np.array([True, False, True, True, False]) |
1 2 |
# np.sumでTRUEの個数を算出 np.sum(vec_bool) |
1 |
3 |
1 2 |
# np.averageでTRUEの割合を算出 np.average(vec_bool) |
1 |
0.6 |
これらの処理はあまり知られていませんが,知っておくと便利なのでぜひマスターしてください.
5.規則的なベクトルの作成
こちらに挙げたnumpyの関数を使用すると,規則的なベクトルを簡単に作成することができます.
今回紹介する関数は
arrange,linspace, repeat, tileの4つになります.
もちろん,これら以外の関数もあるのですが,こちらの4つは非常に使用頻度が高いので,まずはこちらをマスターしましょう.
nは整数,x, y, zは数値,vecはベクトルを示しています.
arange
1 2 |
# 1から10までの等差1の等差ベクトル np.arange(1, 11, 1) |
1 |
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) |
linspace
1 2 |
# 1から10までの長さ4の等差ベクトル np.linspace(1, 10, 4) |
1 |
array([ 1., 4., 7., 10.]) |
repeat
1 2 |
# 1を3回繰り返す np.repeat(1, 3) |
1 |
array([1, 1, 1]) |
1 2 |
# 1を3回,2を3回繰り返す np.repeat(np.array([1, 2]), 3) |
1 |
array([1, 1, 1, 2, 2, 2]) |
tile
1 2 |
# 1を3回繰り返す np.tile(1, 3) |
1 |
array([1, 1, 1]) |
1 2 |
# (1, 2)を3回繰り返す np.tile(np.array([1, 2]), 3) |
1 |
array([1, 2, 1, 2, 1, 2]) |
まとめ
今回はbaseRのベクトルについて,以下のことをやってきました.
- ベクトルの四則演算
- ベクトルのブロードキャスト
- ベクトルの要素抽出
- ベクトルの便利関数
- 規則的なベクトルの作成
いやー,盛りだくさんでしたね!
たくさんありますが,どれも大事なところなので頑張って理解してくださいね.
次回は,論理値ベクトルの処理についてやる予定です.
それでは,お疲れさまでした!
次回
-
【numpy】論理値ベクトルの処理【数値計算】
こんにちは,shun(@datasciencemore)です!!前回は,ベクトルについて学びましたね.その中で,論理値ベクトルを使用することでベクトルの要素を抽出できることを覚えているでしょうか?今回 ...
続きを見る