1. ndarrayをもっと詳しく
前のレッスンでは np.array(リスト) で配列を作りました。
今回は「配列をもっと詳しく」見ていきます。具体的には次の2点です。
- 多次元配列の作り方(2次元・3次元)
- 配列の状態を表す 4つの基本属性(
shape・ndim・size・dtype)
これらは「地味だけど超重要」な基礎で、ここを押さえないと後のレッスンや実務で出るエラーメッセージが読み解けません。 実際、初学者が遭遇するNumPyのバグの大半は「shape が想定と違う」「dtype が違う」ことが原因です。
2. shape と ndim — 配列の「形」を理解する
shape は配列の各次元の要素数を表すタプルです。
ndim は次元の数(軸の数)で、shape の長さと同じです。
- 1次元(ベクトル):
shape = (n,) - 2次元(行列):
shape = (行数, 列数) - 3次元(テンソル):
shape = (深さ, 行数, 列数)など
💡 shape の読み方:
(5,)は「5要素の1次元」。末尾のカンマがあるのは Python のタプル記法で「1要素のタプル」と区別するため(4, 3)は「4行 × 3列」。タプルの 左から順に「大きな単位 → 細かい単位」 を並べる規則で、先頭の4が行数、末尾の3が列数(3, 2, 2)は「3つの(2, 2)行列を重ねたもの」と読む。同様に左から「3スライス × 2行 × 2列」と大→小の順に並ぶ
ndim は単に len(shape) と同じです。
🩺 医療AI文脈: 医療データの典型的なshape:
- 1D:患者1人の検査値リスト(10項目なら shape=(10,))
- 2D:患者×検査項目のテーブル(100人×10項目なら shape=(100, 10))
- 3D:CT画像(スライス数, 高さ, 幅)。例: shape=(64, 512, 512)
- 4D:カラー画像のバッチ(バッチ数, 高さ, 幅, チャンネル)。例: shape=(32, 224, 224, 3)
3. dtype — 配列の「型」を理解する
NumPy配列は全要素が 同じ型 でなければなりません。これが配列を高速化する大きな理由のひとつです。
dtype でその型を確認・指定できます。
| 主な dtype | 意味 | サイズ | 用途 |
|---|---|---|---|
int8 / int16 / int32 / int64 | 整数 | 1〜8 byte | カウント値・ラベル |
float32 / float64 | 小数 | 4 / 8 byte | 連続値・AI学習 |
bool | 真偽値 | 1 byte | マスク・フラグ |
uint8 | 符号なし整数(0〜255) | 1 byte | 画像のピクセル値 |
💡 AI学習で dtype が重要な理由:
- メモリ消費:float64 → float32 でメモリ半分・GPU上で高速化
- 精度:float32 は10進数で約7桁・float64 は約15桁。AI学習では float32 が標準(精度と速度のバランス)
- 計算速度:型が小さいほどキャッシュ効率が良く、ベクトル命令も効きやすい
⚠ 整数型のオーバーフローに注意:
int8 は -128〜127 しか表現できません。それを超える値を入れると ラップアラウンド(値が一周して負になる等)します。
small = np.array([300], dtype=np.int8)
print(small) # [44] ← 期待した 300 にならない!
迷ったら int64(整数)か float32 / float64(小数)を使いましょう。
4. その他の便利属性(size・itemsize・nbytes)
shape・dtype・ndim 以外にも、状況に応じて知っておくと便利な属性があります。
size:全要素数(shapeの積)itemsize:1要素あたりのバイト数nbytes:配列全体のメモリ使用量(size × itemsize)
💡 size と shape の関係:
size は shape の全要素を掛け合わせた値です。
例えば shape=(100, 10) なら size=1000、
shape=(64, 512, 512) なら size=16,777,216(約1700万要素)。
CT画像1枚(64スライス・512×512)で既に1700万要素規模になる、というスケール感を意識しておきましょう。
5. 練習問題
1次元配列の属性を確認しよう
心拍数のリスト [72, 80, 95, 68, 110] から NumPy配列を作り、
shape・ndim・size・dtype をすべて表示してください。
ヒントを見る(答え+解説)
import numpy as np
# 心拍数リストから配列を作ってください
hr = np.array([72, 80, 95, 68, 110])
# shape, ndim, size, dtype を表示してください
print("shape:", hr.shape) # (5,)
print("ndim: ", hr.ndim) # 1
print("size: ", hr.size) # 5
print("dtype:", hr.dtype) # int64
1次元配列の shape は末尾にカンマが付いた (5,) 形式です。整数しか含まないので dtype は int64 に自動推定されます。
2次元配列を作って属性を確認しよう
患者3人 × 検査項目4個のデータを2次元配列として作り、属性を表示してください。
各行:[年齢, 体重, 身長, BMI]
データ:[[45, 65.0, 1.72, 22.0], [62, 58.0, 1.58, 23.2], [33, 78.0, 1.80, 24.1]]
ヒントを見る(答え+解説)
import numpy as np
# 2次元配列を作ってください
patients = np.array([
[45, 65.0, 1.72, 22.0],
[62, 58.0, 1.58, 23.2],
[33, 78.0, 1.80, 24.1]
])
# shape, ndim, size, dtype を表示してください
print("shape:", patients.shape) # (3, 4)
print("ndim: ", patients.ndim) # 2
print("size: ", patients.size) # 12
print("dtype:", patients.dtype) # float64
2次元配列の shape は (行数, 列数)。今回は3患者×4項目なので (3, 4)、size=12。年齢は整数ですが体重・身長など小数があるため、全要素が float64 に揃えられます(NumPyは型を統一するため、混在する場合は広い型に合わせます)。
dtype を変換してみよう
整数配列 scores = np.array([85, 72, 90, 68, 95], dtype=np.int64) を float32 型 に変換し、
変換前後の dtype と nbytes を表示してください。
※ dtype=np.int64 を明示しているのは、ブラウザ実行環境(Pyodide)では指定なしだと int32 になり、メモリ削減効果が見えなくなるためです。
ヒントを見る(答え+解説)
import numpy as np
# int64 を明示的に指定(Pyodideでは指定なしだと int32 になるため)
scores = np.array([85, 72, 90, 68, 95], dtype=np.int64)
# 変換前の dtype と nbytes を表示
print("変換前 dtype:", scores.dtype, " nbytes:", scores.nbytes)
# → 変換前 dtype: int64 nbytes: 40
# float32 に変換してください
scores_f32 = scores.astype(np.float32)
# 変換後の dtype と nbytes を表示
print("変換後 dtype:", scores_f32.dtype, " nbytes:", scores_f32.nbytes)
# → 変換後 dtype: float32 nbytes: 20
.astype(型) で別の型に変換できます。int64(1要素8 byte)から float32(1要素4 byte)にすることでメモリが半分(40→20 bytes)になります。AI学習で大量データを扱うときの定番のテクニックです。
💡 補足:ブラウザ上のPython実行環境(Pyodide)はWASMの32ビット環境のため、np.array([整数]) はデフォルトで int32(4 byte/要素)になります。今回は「メモリ半減」の効果を見せるため dtype=np.int64 を明示しています。実環境(64ビット)では自動的に int64 になることが多いです。
6. まとめ
このレッスンのポイント
- NumPy配列は shape・ndim・size・dtype の4つの属性で「形」と「型」が決まる
shapeは(行, 列, ...)のタプル。エラーメッセージで頻出するので読めるようにしておく- 全要素は同じ
dtypeに揃う。混在する場合は広い型に合わせられる - AI学習では float32 が標準(メモリと精度のバランス)
.astype(型)で型変換できる
自由に試してみましょう:
完了するとコース一覧に進捗が記録されます