🔢 ステップ18: NumPyをインストールして使ってみよう
データ分析の強力な武器、NumPyを使い始めよう!
ここからはPart 4「NumPy入門」に入ります。Part 3までは、Pythonの基本機能だけで統計計算をしてきました。ここからは、データ分析のプロが使う専用のツールを学んでいきます。
📖 このステップで学ぶこと
・NumPyとは何か、なぜ必要なのか
・NumPyのインポート方法
・配列(array)の作り方
・リストと配列の違い
・配列の基本情報を確認する方法
学習時間の目安: 2〜2.5時間
🎯 1. NumPyとは?
まず、「NumPy」がどんなものかを理解しましょう。
🔰 データ分析に欠かせないライブラリ
NumPy(ナンパイ)は、Pythonで数値計算をするための強力なツールです。「Numerical Python(数値のためのPython)」を短くした名前です。
📌 ライブラリとは?
ライブラリとは、便利な機能をまとめた「道具箱」のようなものです。Pythonの基本機能に加えて、専門的な機能を追加できます。
NumPyは「数値計算専用の道具箱」というイメージです。
📘 なぜNumPyが必要なの?
これまで学んだPythonのリストでも計算はできますが、大量のデータを扱う場合は遅くなります。NumPyを使うと、同じ計算が10倍〜100倍速くなることもあります!
💡 リストとNumPyの違い(例え話)
リスト:電卓で1つずつ計算するイメージ
→ 10個の計算なら問題ないが、100万個は大変
NumPy:スーパーコンピュータでまとめて計算するイメージ
→ 100万個でも一瞬で終わる
📘 NumPyの4つの特徴
🚀 NumPyの特徴
| 特徴 | 説明 |
| 高速 | リストより何十倍も速く計算できる |
| 便利 | 平均、合計などが1行で計算できる |
| メモリ効率が良い | 大量のデータを少ないメモリで扱える |
| 多機能 | 統計計算、行列計算など何でもできる |
📘 データ分析の「土台」
これから学ぶPandas(データ分析ライブラリ)やMatplotlib(グラフ作成ライブラリ)も、内部でNumPyを使っています。NumPyはデータ分析の「土台」となる、最も基本的なライブラリなのです。
📦 2. NumPyのインストールとインポート
🔰 Google Colabではすでに使える
良いニュースです!Google ColabではNumPyは最初からインストール済みです。何もインストールせずに、すぐに使い始められます。
💡 自分のパソコンで使う場合
もし自分のパソコンでPythonを使っている場合は、以下のコマンドでインストールできます:
pip install numpy
📘 NumPyをインポートする
NumPyを使う前に、インポート(読み込み)する必要があります。「道具箱を開く」ようなイメージです。
📝 書き方:NumPyのインポート
import numpy as np
import numpy
・「numpyライブラリを読み込む」という意味
as np
・「np という短い名前で使えるようにする」という意味
・毎回 numpy と書くのは長いので、np と省略します
コード:NumPyをインポートする
# NumPyをnpという名前でインポート
import numpy as np
# バージョンを確認(正しくインポートできたか確認)
print(f"NumPyのバージョン: {np.__version__}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
NumPyのバージョン: 1.26.4
💡 コードの解説
np.__version__
・NumPyのバージョン番号を表示します
・__version__(アンダースコア2つで囲む)は特別な属性です
・バージョンが表示されれば、正しくインポートできています
📌 世界共通のルール
import numpy as npは、世界中のデータ分析者の共通ルールです。
誰が書いたコードでも「np」と書いてあればNumPyのことだとわかります。
必ずこの形式で書くようにしましょう!
📊 3. NumPy配列を作ってみよう
NumPyの中心となるのが「配列(array:アレイ)」です。リストに似ていますが、計算に特化したデータ構造です。
🔰 リストから配列を作る
まず、普通のリストからNumPy配列を作る方法を学びましょう。
📝 書き方:配列の作成
np.array(リスト)
np.array()
・リストをNumPy配列に変換する関数
・()の中にリストを入れる
コード:リストから配列を作成
import numpy as np
# 普通のリストを作る
my_list = [1, 2, 3, 4, 5]
# リストからNumPy配列を作る
my_array = np.array(my_list)
# 両方を表示して比較
print(f"リスト: {my_list}")
print(f"配列: {my_array}")
print(f"型: {type(my_array)}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
リスト: [1, 2, 3, 4, 5] 配列: [1 2 3 4 5] 型: <class 'numpy.ndarray'>
💡 見た目の違いに注目!
リスト: [1, 2, 3, 4, 5] ← カンマ(,)で区切られている
配列: [1 2 3 4 5] ← スペースで区切られている
この違いで、リストか配列かを見分けられます。
💡 コードの解説
type(my_array)
・変数の「型(種類)」を調べる関数
・numpy.ndarray と表示される → NumPy配列である証拠
ndarray
・「n-dimensional array」の略
・「n次元配列」という意味です
📘 直接配列を作る
変数を使わずに、直接配列を作ることもできます。
コード:いろいろな配列を直接作成
import numpy as np
# 整数の配列
arr_int = np.array([10, 20, 30, 40, 50])
print(f"整数の配列: {arr_int}")
# 小数の配列
arr_float = np.array([1.5, 2.5, 3.5, 4.5])
print(f"小数の配列: {arr_float}")
# 文字列の配列(あまり使わないが可能)
arr_str = np.array(["りんご", "バナナ", "オレンジ"])
print(f"文字列の配列: {arr_str}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
整数の配列: [10 20 30 40 50] 小数の配列: [1.5 2.5 3.5 4.5] 文字列の配列: ['りんご' 'バナナ' 'オレンジ']
📘 2次元配列を作る
2次元配列は、「表」のようなデータを扱うときに使います。Excelのシートをイメージしてください。
📝 書き方:2次元配列の作成
np.array([[行1], [行2], [行3]])
リストの中にリストを入れることで、行と列を持つ配列を作れます。
コード:2次元配列の作成
import numpy as np
# 2次元配列を作成(3行3列)
arr_2d = np.array([
[1, 2, 3], # 1行目
[4, 5, 6], # 2行目
[7, 8, 9] # 3行目
])
print("2次元配列:")
print(arr_2d)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
2次元配列: [[1 2 3] [4 5 6] [7 8 9]]
💡 2次元配列のイメージ
Excelの表と同じです:
・横方向が「行(row)」
・縦方向が「列(column)」
・今回の例は「3行3列」の配列です
📘 便利な配列の作り方
NumPyには、よく使うパターンの配列を簡単に作れる関数が用意されています。
np.zeros() – ゼロで埋められた配列
コード:ゼロの配列を作成
import numpy as np
# 5個のゼロが入った配列
zeros_arr = np.zeros(5)
print(f"ゼロの配列: {zeros_arr}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
ゼロの配列: [0. 0. 0. 0. 0.]
💡 なぜ「0.」と表示される?
「0.」は「0.0」の省略形で、小数(float型)を意味します。
np.zeros()はデフォルトで小数の配列を作ります。
np.ones() – 1で埋められた配列
コード:1の配列を作成
import numpy as np
# 5個の1が入った配列
ones_arr = np.ones(5)
print(f"1の配列: {ones_arr}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
1の配列: [1. 1. 1. 1. 1.]
np.arange() – 連続した数の配列
📝 書き方:np.arange()
np.arange(終了値) → 0から終了値-1まで
np.arange(開始値, 終了値) → 開始値から終了値-1まで
np.arange(開始値, 終了値, 間隔) → 指定した間隔で
コード:連続した数の配列を作成
import numpy as np
# 0から9までの配列
arr1 = np.arange(10)
print(f"0から9まで: {arr1}")
# 5から14までの配列
arr2 = np.arange(5, 15)
print(f"5から14まで: {arr2}")
# 0から20まで2つ飛ばし
arr3 = np.arange(0, 21, 2)
print(f"0から20まで2つ飛ばし: {arr3}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
0から9まで: [0 1 2 3 4 5 6 7 8 9] 5から14まで: [ 5 6 7 8 9 10 11 12 13 14] 0から20まで2つ飛ばし: [ 0 2 4 6 8 10 12 14 16 18 20]
💡 arangeはrange()のNumPy版
Pythonのrange()と同じように使えますが、結果がNumPy配列になります。
名前も「array + range」を合わせた「arange」です。
np.linspace() – 等間隔に分割した配列
📝 書き方:np.linspace()
np.linspace(開始値, 終了値, 個数)
開始値から終了値までを、指定した個数に等間隔で分割します。
※ arangeと違い、終了値も含まれます
コード:等間隔の配列を作成
import numpy as np
# 0から10までを5個に分割
arr = np.linspace(0, 10, 5)
print(f"0から10を5分割: {arr}")
# 0から100までを11個に分割(10刻み)
arr2 = np.linspace(0, 100, 11)
print(f"0から100を11分割: {arr2}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
0から10を5分割: [ 0. 2.5 5. 7.5 10. ] 0から100を11分割: [ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.]
📌 配列作成関数のまとめ
| 関数 | 用途 | 例 |
| np.array() | リストから配列を作る | np.array([1,2,3]) |
| np.zeros() | ゼロで埋めた配列 | np.zeros(5) |
| np.ones() | 1で埋めた配列 | np.ones(5) |
| np.arange() | 連続した数の配列 | np.arange(10) |
| np.linspace() | 等間隔に分割 | np.linspace(0,10,5) |
🔄 4. NumPy配列とリストの違い
NumPy配列がリストより優れている点を、具体的に見ていきましょう。
🔰 違い1:計算のしやすさ(最大の違い!)
これがNumPyを使う最大の理由です。配列なら、全ての要素に一度に計算できます。
コード:配列とリストの計算の違い
import numpy as np
# リストの場合
my_list = [1, 2, 3, 4, 5]
# my_list * 2 とすると... [1, 2, 3, 4, 5, 1, 2, 3, 4, 5] になる(リストが2回繰り返される)
# 配列の場合
my_array = np.array([1, 2, 3, 4, 5])
result = my_array * 2 # 全ての要素が2倍になる
print(f"元の配列: {my_array}")
print(f"2倍: {result}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
元の配列: [1 2 3 4 5] 2倍: [ 2 4 6 8 10]
💡 この違いは重要!
リスト × 2 → リストが2回繰り返される(連結)
配列 × 2 → 各要素が2倍になる(計算)
データ分析では「各要素に計算」したいことがほとんどなので、NumPyが便利です。
📘 違い2:様々な計算が簡単
四則演算だけでなく、様々な計算が全要素に対して一度にできます。
コード:配列への様々な計算
import numpy as np
arr = np.array([10, 20, 30, 40, 50])
print(f"元の配列: {arr}")
print(f"2倍: {arr * 2}")
print(f"10を足す: {arr + 10}")
print(f"2で割る: {arr / 2}")
print(f"2乗: {arr ** 2}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
元の配列: [10 20 30 40 50] 2倍: [ 20 40 60 80 100] 10を足す: [20 30 40 50 60] 2で割る: [ 5. 10. 15. 20. 25.] 2乗: [ 100 400 900 1600 2500]
💡 リストで同じことをしようとすると…
リストで全要素を2倍にするには、forループが必要です:
result = [x * 2 for x in my_list]
NumPyなら arr * 2 の1行で済みます!
📘 違い3:配列同士の計算
2つの配列の対応する要素同士を計算できます。
コード:配列同士の計算
import numpy as np
arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([10, 20, 30, 40, 50])
print(f"配列1: {arr1}")
print(f"配列2: {arr2}")
print()
# 対応する要素同士を足し算
result_add = arr1 + arr2
print(f"足し算: {result_add}")
# 対応する要素同士を掛け算
result_mul = arr1 * arr2
print(f"掛け算: {result_mul}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
配列1: [1 2 3 4 5] 配列2: [10 20 30 40 50] 足し算: [11 22 33 44 55] 掛け算: [ 10 40 90 160 250]
💡 計算の仕組み
足し算の場合:
1 + 10 = 11、2 + 20 = 22、3 + 30 = 33、…
掛け算の場合:
1 × 10 = 10、2 × 20 = 40、3 × 30 = 90、…
同じ位置の要素同士が計算されます。
⚠️ リストで同じことをすると…
list1 + list2
→ [1, 2, 3, 4, 5, 10, 20, 30, 40, 50] (連結される)
list1 * list2
→ エラーになる
リストでは配列同士の計算ができません!
📘 違い4:データ型の統一
NumPy配列は、全ての要素が同じ型に統一されます。
コード:データ型の統一
import numpy as np
# リスト:異なる型を混在できる
my_list = [1, 2.5, "文字", True]
print(f"リスト: {my_list}")
# 配列:整数と小数を混ぜると、全て小数になる
my_array = np.array([1, 2.5, 3, 4])
print(f"配列: {my_array}")
print(f"配列のデータ型: {my_array.dtype}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
リスト: [1, 2.5, '文字', True] 配列: [1. 2.5 3. 4. ] 配列のデータ型: float64
💡 なぜ型が統一されるのか?
全て同じ型に統一されることで:
・計算が高速になる
・メモリ効率が良くなる
データ分析では数値データを扱うことがほとんどなので、これは利点です。
📏 5. 配列の基本情報を確認する
NumPy配列には、便利な属性(プロパティ)がいくつかあります。配列の情報を調べるのに使います。
🔰 配列の4つの属性
📌 よく使う4つの属性
| 属性 | 意味 | 例 |
| shape | 形(行数×列数) | (3, 4) → 3行4列 |
| ndim | 次元数 | 1 → 1次元、2 → 2次元 |
| size | 全要素数 | 12 → 12個のデータ |
| dtype | データ型 | int64 → 整数 |
💡 属性とメソッドの違い
属性:arr.shape のように () なしで使う → 情報を見るだけ
メソッド:arr.sum() のように () ありで使う → 何か処理をする
📘 1次元配列の情報を確認
コード:1次元配列の属性
import numpy as np
arr = np.array([10, 20, 30, 40, 50])
print(f"配列: {arr}")
print()
print(f"形(shape): {arr.shape}")
print(f"次元数(ndim): {arr.ndim}")
print(f"要素数(size): {arr.size}")
print(f"データ型(dtype): {arr.dtype}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
配列: [10 20 30 40 50] 形(shape): (5,) 次元数(ndim): 1 要素数(size): 5 データ型(dtype): int64
💡 (5,) の意味
(5,) は「1次元で、要素が5個」という意味です。
カンマがあるのは、Pythonのタプル(変更できないリスト)の書き方です。
(5) だと単なる数字の5になってしまうため、(5,) と書きます。
📘 2次元配列の情報を確認
コード:2次元配列の属性
import numpy as np
# 3行4列の2次元配列
arr_2d = np.array([
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
])
print("配列:")
print(arr_2d)
print()
print(f"形(shape): {arr_2d.shape}")
print(f"→ {arr_2d.shape[0]}行 × {arr_2d.shape[1]}列")
print(f"次元数(ndim): {arr_2d.ndim}")
print(f"要素数(size): {arr_2d.size}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
配列: [[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12]] 形(shape): (3, 4) → 3行 × 4列 次元数(ndim): 2 要素数(size): 12
💡 shapeの読み方
shape[0] → 行数(縦の数)
shape[1] → 列数(横の数)
Excelで「3行4列」と言うのと同じ感覚です。
📘 実践例:テストの点数データ
コード:実際のデータで属性を確認
import numpy as np
# 5人の生徒の3科目(国語、数学、英語)の点数
scores = np.array([
[85, 92, 78], # 太郎くん
[90, 88, 95], # 花子さん
[78, 85, 82], # 次郎くん
[92, 90, 88], # 美咲さん
[88, 86, 90] # 健太くん
])
print("点数データ:")
print(scores)
print()
print(f"データの形: {scores.shape}")
print(f"→ {scores.shape[0]}人の生徒、{scores.shape[1]}科目")
print(f"合計データ数: {scores.size}個")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
点数データ: [[85 92 78] [90 88 95] [78 85 82] [92 90 88] [88 86 90]] データの形: (5, 3) → 5人の生徒、3科目 合計データ数: 15個
🎨 6. 配列の要素にアクセスする
配列の特定の要素を取り出す方法を学びましょう。リストと同じようにインデックスを使います。
🔰 1次元配列のインデックス
📝 書き方:インデックスでアクセス
配列[インデックス]
・インデックスは0から始まる(最初の要素は0番目)
・負のインデックスは後ろから数える(-1が最後)
コード:インデックスで要素を取得
import numpy as np
arr = np.array([10, 20, 30, 40, 50])
print(f"配列: {arr}")
print()
print(f"最初の要素 [0]: {arr[0]}")
print(f"3番目の要素 [2]: {arr[2]}")
print(f"最後の要素 [-1]: {arr[-1]}")
print(f"最後から2番目 [-2]: {arr[-2]}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
配列: [10 20 30 40 50] 最初の要素 [0]: 10 3番目の要素 [2]: 30 最後の要素 [-1]: 50 最後から2番目 [-2]: 40
📘 スライスで複数要素を取得
スライスを使うと、連続した複数の要素を一度に取得できます。
📝 書き方:スライス
配列[開始:終了] → 開始から終了-1まで
配列[:終了] → 最初から終了-1まで
配列[開始:] → 開始から最後まで
配列[::間隔] → 指定した間隔で取得
コード:スライスで複数要素を取得
import numpy as np
arr = np.array([10, 20, 30, 40, 50, 60, 70, 80, 90, 100])
print(f"配列: {arr}")
print()
print(f"最初の3つ [:3]: {arr[:3]}")
print(f"3番目から5番目 [2:5]: {arr[2:5]}")
print(f"5番目以降 [4:]: {arr[4:]}")
print(f"2つ飛ばし [::2]: {arr[::2]}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
配列: [ 10 20 30 40 50 60 70 80 90 100] 最初の3つ [:3]: [10 20 30] 3番目から5番目 [2:5]: [30 40 50] 5番目以降 [4:]: [ 50 60 70 80 90 100] 2つ飛ばし [::2]: [ 10 30 50 70 90]
📘 2次元配列のアクセス
2次元配列では、[行, 列]の形式で要素を指定します。
📝 書き方:2次元配列のアクセス
配列[行, 列] → 特定の1つの要素
配列[行] → 行全体(1次元配列として)
配列[:, 列] → 列全体(1次元配列として)
コード:2次元配列の要素にアクセス
import numpy as np
arr_2d = np.array([
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
])
print("配列全体:")
print(arr_2d)
print()
# 特定の要素
print(f"1行目、2列目 [0, 1]: {arr_2d[0, 1]}")
print(f"2行目、3列目 [1, 2]: {arr_2d[1, 2]}")
print()
# 行全体
print(f"2行目全体 [1]: {arr_2d[1]}")
print()
# 列全体
print(f"3列目全体 [:, 2]: {arr_2d[:, 2]}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
配列全体: [[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12]] 1行目、2列目 [0, 1]: 2 2行目、3列目 [1, 2]: 7 2行目全体 [1]: [5 6 7 8] 3列目全体 [:, 2]: [ 3 7 11]
💡 [:, 2] の意味
: は「全部」という意味
[:, 2] は「全ての行の、2列目」という意味
つまり、縦方向に1列分のデータを取り出せます。
📝 練習問題
ここまで学んだことを、実際に手を動かして確認しましょう。
問題1:NumPy配列を作成(初級)
📋 問題
1から10までの整数を含むNumPy配列を作成し、その配列の形(shape)、次元数(ndim)、要素数(size)を表示してください。
解答例を見る
コード
import numpy as np
# 1から10までの配列を作成
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# または np.arange(1, 11) でも作れる
# 情報を表示
print(f"配列: {arr}")
print(f"形(shape): {arr.shape}")
print(f"次元数(ndim): {arr.ndim}")
print(f"要素数(size): {arr.size}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
配列: [ 1 2 3 4 5 6 7 8 9 10] 形(shape): (10,) 次元数(ndim): 1 要素数(size): 10
問題2:配列の計算(初級)
📋 問題
[5, 10, 15, 20, 25]という配列を作成し、全ての要素を2倍にした結果と、10を足した結果を表示してください。
解答例を見る
コード
import numpy as np
# 配列を作成
arr = np.array([5, 10, 15, 20, 25])
# 計算
doubled = arr * 2
added = arr + 10
print(f"元の配列: {arr}")
print(f"2倍: {doubled}")
print(f"10を足す: {added}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
元の配列: [ 5 10 15 20 25] 2倍: [10 20 30 40 50] 10を足す: [15 20 25 30 35]
問題3:便利な配列作成関数(中級)
📋 問題
以下の配列を作成してください:
1. 0で埋められた長さ8の配列
2. 1で埋められた長さ6の配列
3. 0から20までの連続した整数の配列
解答例を見る
コード
import numpy as np
# 1. ゼロで埋められた配列
zeros_arr = np.zeros(8)
print(f"ゼロの配列: {zeros_arr}")
# 2. 1で埋められた配列
ones_arr = np.ones(6)
print(f"1の配列: {ones_arr}")
# 3. 0から20までの連続した整数
range_arr = np.arange(21) # 21を指定すると0-20になる
print(f"0-20の配列: {range_arr}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
ゼロの配列: [0. 0. 0. 0. 0. 0. 0. 0.] 1の配列: [1. 1. 1. 1. 1. 1.] 0-20の配列: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20]
問題4:2次元配列の作成と操作(中級)
📋 問題
3行3列の2次元配列を作成し(値は自由)、以下を実行してください:
1. 配列の形(shape)を表示
2. 2行目を表示
3. 2列目を表示
解答例を見る
コード
import numpy as np
# 3行3列の配列を作成
arr_2d = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
print("配列:")
print(arr_2d)
print()
# 1. 配列の形
print(f"配列の形: {arr_2d.shape}")
# 2. 2行目(インデックス1)
print(f"2行目: {arr_2d[1]}")
# 3. 2列目(インデックス1)
print(f"2列目: {arr_2d[:, 1]}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
配列: [[1 2 3] [4 5 6] [7 8 9]] 配列の形: (3, 3) 2行目: [4 5 6] 2列目: [2 5 8]
問題5:配列同士の計算(上級)
📋 問題
[10, 20, 30, 40, 50]という配列と[5, 15, 25, 35, 45]という配列を作成し、以下を計算してください:
1. 2つの配列の足し算
2. 2つの配列の要素ごとの掛け算
3. 最初の配列の各要素を2乗した結果
解答例を見る
コード
import numpy as np
# 2つの配列を作成
arr1 = np.array([10, 20, 30, 40, 50])
arr2 = np.array([5, 15, 25, 35, 45])
print(f"配列1: {arr1}")
print(f"配列2: {arr2}")
print()
# 1. 足し算
result_add = arr1 + arr2
print(f"足し算: {result_add}")
# 2. 掛け算(要素ごと)
result_mul = arr1 * arr2
print(f"掛け算: {result_mul}")
# 3. 2乗
result_square = arr1 ** 2
print(f"配列1の2乗: {result_square}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
配列1: [10 20 30 40 50] 配列2: [ 5 15 25 35 45] 足し算: [15 35 55 75 95] 掛け算: [ 50 300 750 1400 2250] 配列1の2乗: [ 100 400 900 1600 2500]
問題6:実践:売上データの計算(上級)
📋 問題
ある店の1週間の売上データ [50000, 62000, 58000, 71000, 65000, 88000, 92000](単位:円)があります。
1. 売上に消費税10%を加えた金額を計算
2. 各日の売上から目標売上60000円との差を計算
3. すべての値を1000で割って「千円単位」で表示
解答例を見る
コード
import numpy as np
# 売上データ(円)
sales = np.array([50000, 62000, 58000, 71000, 65000, 88000, 92000])
print(f"元の売上(円): {sales}")
print()
# 1. 消費税10%を加える(×1.1 する)
sales_with_tax = sales * 1.1
print(f"税込売上(円): {sales_with_tax}")
# 2. 目標60000円との差
target = 60000
diff_from_target = sales - target
print(f"目標との差(円): {diff_from_target}")
# 3. 千円単位で表示(÷1000 する)
sales_in_thousands = sales / 1000
print(f"売上(千円): {sales_in_thousands}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
元の売上(円): [50000 62000 58000 71000 65000 88000 92000] 税込売上(円): [ 55000. 68200. 63800. 78100. 71500. 96800. 101200.] 目標との差(円): [-10000 2000 -2000 11000 5000 28000 32000] 売上(千円): [50. 62. 58. 71. 65. 88. 92.]
🎯 このステップのまとめ
✅ 学んだこと
✓ NumPyはデータ分析に必須のライブラリ
✓ import numpy as np でインポートするのが標準
✓ np.array() でリストから配列を作成できる
✓ np.zeros(), np.ones(), np.arange(), np.linspace() で便利に配列を作成
✓ 配列はリストより計算が簡単で速い
✓ 配列全体に一度に計算ができる(ブロードキャスト)
✓ shape, ndim, size, dtype で配列の情報がわかる
✓ インデックスとスライスで要素にアクセスできる
💡 次のステップに進む前に確認
以下のことができるようになったか確認しましょう:
□ NumPyをインポートできる
□ np.array()で配列を作成できる
□ 配列全体に計算を適用できる
□ 配列の基本情報(shape, size等)を確認できる
□ インデックスとスライスで要素にアクセスできる
これらができたら、次のステップに進みましょう!
❓ よくある質問
Q1: NumPyはなぜリストより速いのですか?
A: NumPyは内部でC言語を使って実装されており、データがメモリ上に連続して配置されています。また、全て同じ型のデータなので最適化された計算ができます。リストは柔軟ですが、その分遅くなります。
Q2: なぜ「np」という名前を使うのですか?
A: 毎回「numpy」と書くのは長くて面倒なので、npという短い名前(エイリアス)を使うのが世界中の共通ルールになっています。誰が書いても同じ形式なので、コードが読みやすくなります。
Q3: リストとNumPy配列はどう使い分けますか?
A: 数値計算やデータ分析をするときはNumPy配列を使いましょう。異なる型のデータを扱う、要素の追加削除が多い場合はリストが便利です。データ分析では基本的にNumPyを使います。
Q4: 配列の中に異なる型のデータは入れられますか?
A: 入れることはできますが、全て同じ型に変換されます。例えば、整数と文字列を混ぜると全て文字列になります。NumPyは同じ型で統一することで高速な計算を実現しているため、基本的には同じ型のデータだけを入れるようにしましょう。
Q5: float64やint64って何ですか?
A: データ型の詳細な情報です。float64は64ビットの浮動小数点数(小数)、int64は64ビットの整数という意味です。数字が大きいほど、より大きな数や精度の高い数を扱えます。通常は気にしなくて大丈夫です。
学習メモ
Pythonデータ分析入門 - Step 18