1. なぜ配列生成関数が複数あるのか
前のレッスンで np.array(リスト) で配列を作りました。
しかし実務では「サイズが大きすぎてリストを書けない」「中身の値を後で埋める」「ランダムな値が欲しい」など、
「リストから作る」以外の方法が必要な場面が多くあります。
NumPyにはそのための便利な配列生成関数が揃っており、用途ごとに使い分けます。 このレッスンで主要な6種類を押さえれば、実装で迷うことはほぼなくなります。
| 関数 | 作るもの | 主な用途 |
|---|---|---|
np.zeros(shape) | 全要素0の配列 | 結果を後から入れる「入れ物」 |
np.ones(shape) | 全要素1の配列 | マスク・重みの初期化 |
np.full(shape, 値) | 全要素を任意の値で埋めた配列 | 欠損値マークなど |
np.arange(start, stop, step) | 等差数列(整数指定) | インデックス・時系列の番号 |
np.linspace(start, stop, num) | 等差数列(個数指定) | 閾値の格子・グラフのX軸 |
np.random.rand / randn / randint | 乱数配列 | ダミーデータ・AI重み初期化 |
2. 同じ値で埋める(zeros / ones / full)
「これから計算結果を入れる入れ物」を先に作っておく という使い方が定番です。 shape をタプルで指定するだけで、その形の配列を一発で作れます。
💡 使い分けのコツ:
zeros:結果を後から計算して入れる場合(デフォルト)ones:マスク用、または1で重みを初期化したいときfull:欠損値マーカー(-1 や NaN)で全体を埋めたいときzeros_like(a):すでにある配列aと同じ shape の入れ物が欲しいとき
🩺 医療AI文脈:
CT画像処理では「画像と同じサイズのマスク(注目領域は1、それ以外は0)」を np.zeros_like(image) で作る場面が頻出です。
また、患者集計テーブルを np.zeros((患者数, 検査項目数)) で確保し、後から値を埋めるパターンも定番です。
3. 等差数列(arange / linspace)
等間隔の数列を作りたいときは arange と linspace を使い分けます。
この2つは似ているようで、指定する内容が異なります。
| 関数 | 指定するもの | 用途 |
|---|---|---|
arange(start, stop, step) | start・stop・刻み幅(stopは含まない) | インデックス・1刻みの数列 |
linspace(start, stop, num) | start・stop・個数(stopを含む) | 「N等分」したいとき・閾値格子 |
💡 arange と linspace の選び方(やりたいことから判断):
✅ arange を使う場面:「◯◯ずつ進めたい」(刻み幅が先に決まっている)
- 「30分ごとにモニタリングデータを記録したい」 →
np.arange(0, 24, 0.5) - 「1時間刻みでバイタル測定」 →
np.arange(24) - 「整数の連番が欲しい」(患者ID 0〜99など) →
np.arange(100)
✅ linspace を使う場面:「ちょうど◯個に分けたい」(個数が先に決まっている)
- 「BMI 18.5〜30.0 を ちょうど10段階に分けたい」 →
np.linspace(18.5, 30.0, 10)(刻み幅は自動計算) - 「グラフのX軸用に 0〜1 を 100点欲しい」 →
np.linspace(0, 1, 100) - 「両端の値(
startとstop)を必ず含めたい」 →linspace一択(arangeは stop を含まない)
💭 直感的イメージ:
arange は 「歩幅を決めて進む」、linspace は 「ゴールまでの距離を均等に区切る」。
「結果として何個になるか分からなくていい」なら arange、「ちょうどN個にしたい」なら linspace。
⚠ 小数の刻みは linspace の方が安全:
np.arange(0, 1, 0.1) のような書き方は浮動小数点の誤差で要素数がブレることがあります(10個になるはずが11個になる等)。小数刻みで「ちょうどN個」が欲しいときは linspace を使いましょう。
4. 乱数(random)
ダミーデータの生成や AI モデルの重み初期化など、乱数が必要な場面は多くあります。
NumPyの np.random モジュールには様々な乱数生成関数があります。
| 関数 | 生成される乱数 | 典型的な用途 |
|---|---|---|
np.random.rand(d1, d2, ...) | 0〜1の一様乱数 | 確率値・テストデータ |
np.random.randn(d1, d2, ...) | 平均0・標準偏差1の正規分布 | AI重み初期化・ノイズ |
np.random.randint(low, high, size) | low〜high-1 の整数 | ラベル・サンプリング |
np.random.normal(mean, std, size) | 任意の正規分布 | ダミー検査値 |
💡 seed を必ず指定する理由:
乱数は実行のたびに変わるため、同じ結果を再現したいときは np.random.seed(値) で初期値を固定します。
seedを固定しないと、毎回違う数字になってデバッグが困難になります。AI実験では「seed=42 を使う」のが世界的なジョーク兼慣習です。
🤖 AI用語メモ — 「重みの初期化」とは?
AIニューラルネットの内部にある「重み」と呼ばれる数値の集まりは、学習を始める前にランダムな値で初期化する必要があります。
この初期化に np.random.randn や類似の正規分布乱数が使われます(PyTorch等のフレームワークでも内部で似た処理が行われます)。
このコースでは詳細は扱いませんが、「乱数配列はAIの最初の状態を作るために必要」と覚えておけば十分です。
5. 練習問題
arange で時系列番号を作ろう
ICUのモニタリングデータで「0時から24時まで30分刻みのタイムスタンプ」配列を作ってください。
arange を使い、要素数が48個になることも shape で確認しましょう。
ヒントを見る(答え+解説)
import numpy as np
# 0〜24時間、30分刻み(=0.5刻み)の配列を作ってください
timestamps = np.arange(0, 24, 0.5)
print("配列:", timestamps)
print("shape:", timestamps.shape) # (48,)
arange(start, stop, step) で start=0、stop=24(含まない)、step=0.5 を指定します。0.0, 0.5, 1.0, ..., 23.5 の48要素になります。
linspace で閾値格子を作ろう
体温 35.0℃ から 41.0℃ までを 0.5℃ 刻みで分けたいとします(13個の値)。
linspace を使って、両端を含む13個の値を生成してください。
ヒントを見る(答え+解説)
import numpy as np
# linspace で 35.0〜41.0 を 13個に分けてください
temps = np.linspace(35.0, 41.0, 13)
print("体温閾値:", temps)
# → [35. 35.5 36. 36.5 37. 37.5 38. 38.5 39. 39.5 40. 40.5 41. ]
print("shape:", temps.shape) # (13,)
linspace(start, stop, num) は両端を含めて num 個の値を生成します。「N等分」したいときに便利。arange(35.0, 41.5, 0.5) でも近い結果は得られますが、浮動小数点誤差で要素数がブレることがあるため、個数を厳密に指定したいときは linspace が安全です。
乱数でダミー検査値を作ろう
収縮期血圧(SBP)のダミーデータを、平均130・標準偏差20の正規分布から30人分生成してください。 seedは42に固定して、再現性を確保しましょう。
ヒントを見る(答え+解説)
import numpy as np
# seed を 42 に固定してください
np.random.seed(42)
# 平均130・標準偏差20・30人分のダミー血圧を生成
sbp = np.random.normal(130, 20, size=30)
print("ダミーSBP:", sbp.round(1))
print("平均:", sbp.mean().round(1)) # 130に近い値
print("標準偏差:", sbp.std().round(1)) # 20に近い値
np.random.normal(mean, std, size) は任意の平均・標準偏差の正規分布を生成します。np.random.seed(42) を毎回コードの最初に書いておけば、誰が実行しても同じ結果が得られます。AI実験の再現性確保で必須のテクニックです。
6. まとめ
このレッスンのポイント
zeros/ones/full:同じ値で埋めた配列を作る。結果を後で入れる「入れ物」用arange:刻み幅を指定。Pythonのrange感覚(stopは含まない)linspace:個数を指定。両端を含む等分。閾値格子に便利np.random.normal / randn / rand / randint:用途に応じた乱数生成- 再現性のため
np.random.seed(値)でseedを固定する習慣をつける
自由に試してみましょう:
完了するとコース一覧に進捗が記録されます