【完全版】NumPy配列の情報を取得する方法まとめ

python

NumPyの配列(ndarray)は、Pythonでの科学計算・機械学習・画像処理などに欠かせない基本的なデータ構造です。

その中で、「今の配列は何次元?」「中身の型は?」「全部で何個の要素?」といった情報を確認することは、エラー防止と効率的なプログラム作成のためにとても重要です。

この記事では、NumPy配列のさまざまな情報を確認するための方法を初心者向けにやさしく説明します。

スポンサーリンク

基本的な配列情報の取得方法

よく使う配列の属性一覧

属性・関数内容使用例
.shape配列の形状(何行何列か)arr.shape
.ndim配列の次元数arr.ndim
.size要素数(全ての要素の合計)arr.size
.dtype各要素のデータ型arr.dtype
.itemsize1要素あたりのバイト数arr.itemsize
.nbytes配列全体のバイトサイズarr.nbytes

実際の使用例

import numpy as np

# 2行3列の配列を作成
arr = np.array([[1, 2, 3], [4, 5, 6]])
print("配列の中身:")
print(arr)
# 結果:
# [[1 2 3]
#  [4 5 6]]

print(f"形状(何行何列か): {arr.shape}")        # 結果: (2, 3)
print(f"次元数: {arr.ndim}")                    # 結果: 2
print(f"要素数: {arr.size}")                    # 結果: 6
print(f"データ型: {arr.dtype}")                 # 結果: int64(環境により異なる)
print(f"1要素のバイト数: {arr.itemsize}")        # 結果: 8
print(f"配列全体のバイト数: {arr.nbytes}")       # 結果: 48(6要素 × 8バイト)

各属性の詳しい説明

shape(形状)

# 1次元配列
arr_1d = np.array([1, 2, 3, 4, 5])
print(arr_1d.shape)  # 結果: (5,)  ← 5個の要素

# 2次元配列
arr_2d = np.array([[1, 2], [3, 4], [5, 6]])
print(arr_2d.shape)  # 結果: (3, 2) ← 3行2列

# 3次元配列
arr_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(arr_3d.shape)  # 結果: (2, 2, 2) ← 2×2×2

ndim(次元数)

print(arr_1d.ndim)  # 結果: 1 (1次元)
print(arr_2d.ndim)  # 結果: 2 (2次元)
print(arr_3d.ndim)  # 結果: 3 (3次元)

size(要素数)

print(arr_1d.size)  # 結果: 5  (5個の要素)
print(arr_2d.size)  # 結果: 6  (3×2=6個の要素)
print(arr_3d.size)  # 結果: 8  (2×2×2=8個の要素)

dtype(データ型)

# 整数配列
int_arr = np.array([1, 2, 3])
print(int_arr.dtype)  # 結果: int64

# 浮動小数点配列
float_arr = np.array([1.0, 2.0, 3.0])
print(float_arr.dtype)  # 結果: float64

# 文字列配列
str_arr = np.array(['a', 'b', 'c'])
print(str_arr.dtype)  # 結果: <U1

まとめ

  • 配列の「構造」と「データ型」の理解が、デバッグやreshapeのミス防止に直結します

配列の中身をざっくり確認したいとき

大きな配列の一部を表示

NumPyでは配列の中身を部分的に確認するには、スライスを使います。

# 大きな配列を作成
large_arr = np.arange(100).reshape(10, 10)

print("最初の3行:")
print(large_arr[:3])

print("最初の3行3列:")
print(large_arr[:3, :3])

print("最後の2行:")
print(large_arr[-2:])

NumPyの表示設定を変更

# 大きな配列でも省略されずに表示
np.set_printoptions(threshold=np.inf)  # 全て表示

# 元に戻す
np.set_printoptions(threshold=1000)    # デフォルト

# 小数点以下の桁数を設定
np.set_printoptions(precision=2)       # 小数点以下2桁

tolist()でPythonのリストに変換

arr = np.array([[1, 2, 3], [4, 5, 6]])
python_list = arr.tolist()
print(python_list)
# 結果: [[1, 2, 3], [4, 5, 6]]

# 構造がわかりやすくなる
import pprint
pprint.pprint(python_list)

info()で詳細情報を確認

# 配列の詳細情報
arr = np.array([[1, 2, 3], [4, 5, 6]])
print("配列の詳細情報:")
print(f"  型: {type(arr)}")
print(f"  形状: {arr.shape}")
print(f"  データ型: {arr.dtype}")
print(f"  メモリレイアウト: {'C順' if arr.flags.c_contiguous else 'F順'}")
print(f"  書き込み可能: {arr.flags.writeable}")

まとめ

  • 表示が大きすぎる場合は、スライスで部分表示を活用
  • tolist()で構造把握、設定変更で表示をカスタマイズ

配列の中身を統計的に把握する方法

基本的な統計値

import numpy as np

# サンプルデータを作成
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

print(f"最小値: {np.min(data)}")        # 結果: 1
print(f"最大値: {np.max(data)}")        # 結果: 10
print(f"合計値: {np.sum(data)}")        # 結果: 55
print(f"平均値: {np.mean(data)}")       # 結果: 5.5
print(f"中央値: {np.median(data)}")     # 結果: 5.5
print(f"標準偏差: {np.std(data)}")      # 結果: 2.87...
print(f"分散: {np.var(data)}")          # 結果: 8.25

軸を指定した統計計算

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

print("元の配列:")
print(matrix)

print(f"全体の平均: {np.mean(matrix)}")           # 結果: 5.0

print(f"各列の平均: {np.mean(matrix, axis=0)}")   # 結果: [4. 5. 6.]
print(f"各行の平均: {np.mean(matrix, axis=1)}")   # 結果: [2. 5. 8.]

print(f"各列の合計: {np.sum(matrix, axis=0)}")    # 結果: [12 15 18]
print(f"各行の合計: {np.sum(matrix, axis=1)}")    # 結果: [ 6 15 24]

ユニークな要素の分析

# 重複要素を含む配列
data = np.array([1, 2, 2, 3, 3, 3, 4, 4, 4, 4])

# 重複を除いた要素一覧
unique_values = np.unique(data)
print(f"ユニークな値: {unique_values}")  # 結果: [1 2 3 4]

# 要素ごとの出現回数
unique_values, counts = np.unique(data, return_counts=True)
print(f"値: {unique_values}")     # 結果: [1 2 3 4]
print(f"回数: {counts}")          # 結果: [1 2 3 4]

# 辞書形式で表示
count_dict = dict(zip(unique_values, counts))
print(f"出現回数: {count_dict}")  # 結果: {1: 1, 2: 2, 3: 3, 4: 4}

欠損値や異常値のチェック

# NaN(Not a Number)を含む配列
data_with_nan = np.array([1.0, 2.0, np.nan, 4.0, 5.0])

print(f"NaNが含まれるか: {np.isnan(data_with_nan).any()}")
print(f"NaNの個数: {np.isnan(data_with_nan).sum()}")
print(f"有効な値の個数: {np.isfinite(data_with_nan).sum()}")

# 無限大を含む配列
data_with_inf = np.array([1.0, 2.0, np.inf, 4.0, -np.inf])

print(f"無限大が含まれるか: {np.isinf(data_with_inf).any()}")
print(f"有限な値のみ: {data_with_inf[np.isfinite(data_with_inf)]}")

まとめ

  • 値の傾向やデータ品質のチェックに、これらの統計関数が大活躍
  • 軸を指定することで、多次元配列でも柔軟な統計計算が可能

実務で役立つ!よく使う組み合わせ例

多次元配列の確認とreshape

# 1次元配列を作成
arr = np.arange(12)
print(f"元の形状: {arr.shape}")       # 結果: (12,)
print(f"元の配列: {arr}")

# 2次元に変換
arr_2d = arr.reshape(3, 4)
print(f"変換後の形状: {arr_2d.shape}")  # 結果: (3, 4)
print("変換後の配列:")
print(arr_2d)
# 結果:
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

# -1を使った自動計算
arr_auto = arr.reshape(2, -1)  # 2行、列数は自動計算
print(f"自動計算の形状: {arr_auto.shape}")  # 結果: (2, 6)

画像データの確認

# 画像データの例(高さ×幅×RGB)
image = np.random.randint(0, 256, size=(480, 640, 3), dtype=np.uint8)

print("画像情報:")
print(f"  形状: {image.shape}")              # 結果: (480, 640, 3)
print(f"  次元数: {image.ndim}")             # 結果: 3
print(f"  データ型: {image.dtype}")          # 結果: uint8
print(f"  画素数: {image.shape[0] * image.shape[1]}")  # 結果: 307200
print(f"  メモリ使用量: {image.nbytes / 1024 / 1024:.2f} MB")

print(f"  ピクセル値の範囲: {image.min()} 〜 {image.max()}")
print(f"  平均ピクセル値: {image.mean():.2f}")

機械学習データの確認

# 機械学習でよくある形式(サンプル数×特徴数)
X = np.random.randn(1000, 50)  # 1000サンプル、50特徴
y = np.random.randint(0, 2, 1000)  # 二値分類のラベル

print("特徴量データ (X):")
print(f"  形状: {X.shape}")                    # 結果: (1000, 50)
print(f"  データ型: {X.dtype}")               # 結果: float64
print(f"  平均: {X.mean():.3f}")               
print(f"  標準偏差: {X.std():.3f}")           

print("ラベルデータ (y):")
print(f"  形状: {y.shape}")                    # 結果: (1000,)
print(f"  ユニークな値: {np.unique(y)}")       # 結果: [0 1]
print(f"  クラス分布: {np.bincount(y)}")       # 各クラスの数

メモリ使用量の監視

def check_memory_usage(arr, name="配列"):
    """配列のメモリ使用量を確認する関数"""
    bytes_size = arr.nbytes
    
    if bytes_size < 1024:
        size_str = f"{bytes_size} B"
    elif bytes_size < 1024**2:
        size_str = f"{bytes_size / 1024:.2f} KB"
    elif bytes_size < 1024**3:
        size_str = f"{bytes_size / 1024**2:.2f} MB"
    else:
        size_str = f"{bytes_size / 1024**3:.2f} GB"
    
    print(f"{name}: {arr.shape}, {arr.dtype}, {size_str}")

# 使用例
small_arr = np.arange(100)
medium_arr = np.random.randn(1000, 1000)
large_arr = np.zeros((10000, 10000), dtype=np.float32)

check_memory_usage(small_arr, "小さな配列")
check_memory_usage(medium_arr, "中程度の配列")
check_memory_usage(large_arr, "大きな配列")

配列の型変換とメモリ節約

# 大きな配列でメモリを節約
large_data = np.random.randn(10000, 1000)

print("元のデータ:")
check_memory_usage(large_data, "float64配列")

# float32に変換してメモリを半分に
large_data_f32 = large_data.astype(np.float32)
print("変換後:")
check_memory_usage(large_data_f32, "float32配列")

# 整数データの場合
int_data = np.random.randint(0, 100, size=(10000, 1000))
print("整数データ:")
check_memory_usage(int_data, "int64配列")

# より小さな整数型に変換
int_data_small = int_data.astype(np.uint8)  # 0-255の範囲なら
print("変換後:")
check_memory_usage(int_data_small, "uint8配列")

トラブルシューティング:よくあるエラーと対処法

形状の不一致エラー

# よくあるエラー例
try:
    a = np.array([[1, 2], [3, 4]])        # (2, 2)
    b = np.array([1, 2, 3])               # (3,)
    result = a + b  # エラー発生
except ValueError as e:
    print(f"エラー: {e}")

# 解決方法1: reshapeで形状を合わせる
a = np.array([[1, 2], [3, 4]])
b = np.array([1, 2]).reshape(2, 1)  # (2, 1)に変換
result = a + b
print("解決方法1の結果:")
print(result)

# 解決方法2: broadcastingを活用
a = np.array([[1, 2], [3, 4]])
b = np.array([1, 2])  # (2,)でもbroadcastingで計算可能
result = a + b
print("解決方法2の結果:")
print(result)

データ型の確認と変換

# データ型が原因のエラー
str_arr = np.array(['1', '2', '3'])
print(f"文字列配列の型: {str_arr.dtype}")

# 数値に変換
num_arr = str_arr.astype(int)
print(f"数値配列の型: {num_arr.dtype}")
print(f"変換結果: {num_arr}")

# 安全な変換(エラーハンドリング)
mixed_arr = np.array(['1', '2', 'abc'])
try:
    safe_arr = mixed_arr.astype(int)
except ValueError:
    print("変換できない値が含まれています")
    # pd.to_numeric()等を使った柔軟な変換も可能

まとめ

情報内容属性/関数使う場面
形状(行・列).shape(2, 3)reshape前の確認
次元数.ndim2多次元データの把握
要素数.size6ループ処理の範囲確認
データ型.dtypeint64計算精度の確認
メモリサイズ.nbytes48メモリ使用量の監視
統計値np.mean() など平均・合計・標準偏差データの品質確認

実用的なチェック関数

最後に、配列の情報を一度に確認できる便利な関数を紹介します:

def array_info(arr, name="配列"):
    """NumPy配列の詳細情報を表示する関数"""
    print(f"=== {name}の情報 ===")
    print(f"形状: {arr.shape}")
    print(f"次元数: {arr.ndim}")
    print(f"要素数: {arr.size}")
    print(f"データ型: {arr.dtype}")
    print(f"メモリ使用量: {arr.nbytes / 1024:.2f} KB")
    
    if arr.size > 0:  # 空配列でない場合
        print(f"最小値: {arr.min()}")
        print(f"最大値: {arr.max()}")
        print(f"平均値: {arr.mean():.3f}")
        print(f"標準偏差: {arr.std():.3f}")
    
    print(f"ユニークな値の数: {len(np.unique(arr))}")
    print()

# 使用例
data1 = np.random.randn(100, 50)
data2 = np.arange(24).reshape(4, 6)

array_info(data1, "ランダムデータ")
array_info(data2, "整数データ")

コメント

タイトルとURLをコピーしました