「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。現在、コンサルタントの雛になるべく、少しずつ勉強中です(※2024年12月10日改訂)。

MENU

Pythonによるデータ分析(その07/X)

 仕事上、早々に\mathrm{Python}を使えるようにしないといけないため、

を基に学んでいく。

3. NumPyの基礎:配列とベクトル演算

 \mathrm{NumPy}は"\mathrm{Numerical\ Python}"の意味で\mathrm{Python}での数値計算におけるもっとも重要な基本パッケージの1つである。

3.1 NumPy ndarray:多次元配列オブジェクト

 \mathrm{ndarray}に対する算術操作は、その配列要素全てに作用する。
 1次元\mathrm{ndarray}\mathrm{Python}のリストと同じような振る舞いをするが、異なるのはスライスが元の\mathrm{ndarray}のビューで、元の\mathrm{ndarray}のコピーではない点である。

3.1.4 インデックス参照とスライシングの基礎

 インデックス査証はデータからその一部を切り出す、もしくはその個々の要素を取り出す機能である。

import numpy as np

arr = np.arange(10)
print(arr)

# インデックス参照
a = arr[5]
print(a)

b = arr[5:8]
print(b)

arr[5:8] = 12 # ブロードキャスト
print(arr)

# 重要なのは、スライスは元のndarrayのビューである点:
b[0] = 1
print(arr) # bを変更したのにarrが変わっている

b[:] = -5
print(arr)

b = 5 # ちなみに左記は上のb[:]と挙動が異なる
print(b)
print(arr)

### 2次元配列
arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])

a = arr2d[2]
print(a)

b1 = arr2d[0][2]
b2 = arr2d[0,2]
print(b1)
print(b2)

ビューとしているのは大量のデータを処理する場合にパフォーマンスおよびメモリ容量の問題が生じるためである。

3.1.5 スライスによるインデックス参照

 \mathrm{ndarray}でもスライス記法による切り出すが可能である。

arr = np.arange(10)
arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])

a = arr[1:6]
b = arr2d[:2]
c = arr2d[:2,1:]

print(a)
print(b)
print(c)
3.1.6 ブールインデックス参照

 データの重複が許された配列からある値を持つものを取り出したいとする。このときブール値をもつインデックスで抽出することができる。

### ブールインデックスによる抽出
names = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])
data = np.random.randn(len(names),4) # namesの各要素に対応する値とする(値自体に意味はない)

# Bobに対応する値を抽出したい
flg1 = names=='Bob'
print(data)
print(data[flg1])

print('*********************')
# ブールインデックスは、スライスやスカラー値によるインデックスと併記可能
data[names == 'Bob',2:]

# Bob以外に対応する値を抽出したい
flg2 = names!='Bob'
print(data)
print(data[~flg1]) # ~:真偽を反転させる演算子
print(data[flg2])
   論理演算子 意味
   ~,\mathrm{not} 否定
   &,\mathrm{and} 論理積
   *1,\mathrm{or} 論理和
3.1.6 ファンシーインデックス参照

 インデックス参照に整数配列を用いる方法をファンシーインデックス参照という。

3.1.7 転置行列、行と列の入れ替え

 \mathrm{ndarray}の転置は、オリジナル行列を再配置した特別なビューを返す。コピーは生成しない。

# 転置:transpose関数または属性Tを参照
arr = np.arange(15).reshape(3,5) # 3×5に成型しなおす

print(arr)
print(arr.T)
print(np.transpose(arr))

*1:はてなブログの仕様で正確に書いていないが、半角にする。

プライバシーポリシー お問い合わせ