Python環境を起動中... 初回のみ数秒かかります
Lesson 2 / 12

ndarrayの作成と属性

このレッスンで学ぶこと

  • 1次元・2次元・3次元のndarrayを作れる
  • shapendimsize で配列の「形」を理解できる
  • dtype で配列の「型」を理解し、必要に応じて変換できる
  • エラーメッセージに出てくる shape 情報を読み解けるようになる

1. ndarrayをもっと詳しく

前のレッスンでは np.array(リスト) で配列を作りました。 今回は「配列をもっと詳しく」見ていきます。具体的には次の2点です。

これらは「地味だけど超重要」な基礎で、ここを押さえないと後のレッスンや実務で出るエラーメッセージが読み解けません。 実際、初学者が遭遇するNumPyのバグの大半は「shape が想定と違う」「dtype が違う」ことが原因です。

2. shape と ndim — 配列の「形」を理解する

shape は配列の各次元の要素数を表すタプルです。 ndim は次元の数(軸の数)で、shape の長さと同じです。

sample_1.py
Ctrl+Enter
出力

💡 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画像のピクセル値
sample_2.py
Ctrl+Enter
出力

💡 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 以外にも、状況に応じて知っておくと便利な属性があります。

sample_3.py
Ctrl+Enter
出力

💡 size と shape の関係: sizeshape の全要素を掛け合わせた値です。 例えば shape=(100, 10) なら size=1000shape=(64, 512, 512) なら size=16,777,216(約1700万要素)。 CT画像1枚(64スライス・512×512)で既に1700万要素規模になる、というスケール感を意識しておきましょう。

5. 練習問題

問題 1

1次元配列の属性を確認しよう

心拍数のリスト [72, 80, 95, 68, 110] から NumPy配列を作り、 shape・ndim・size・dtype をすべて表示してください。

exercise_1.py
出力
ヒントを見る(答え+解説)
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,) 形式です。整数しか含まないので dtypeint64 に自動推定されます。

問題 2

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]]

exercise_2.py
出力
ヒントを見る(答え+解説)
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は型を統一するため、混在する場合は広い型に合わせます)。

問題 3

dtype を変換してみよう

整数配列 scores = np.array([85, 72, 90, 68, 95], dtype=np.int64)float32 型 に変換し、 変換前後の dtypenbytes を表示してください。
dtype=np.int64 を明示しているのは、ブラウザ実行環境(Pyodide)では指定なしだと int32 になり、メモリ削減効果が見えなくなるためです。

exercise_3.py
出力
ヒントを見る(答え+解説)
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(型) で型変換できる

自由に試してみましょう:

free_practice.py
出力

完了するとコース一覧に進捗が記録されます