プログラミング初心者でも安心! NumPy C-API `PyDataType_ISNUMBER()` 入門


関数の詳細

  • 戻り値
    • 数値型の場合: 1
    • 数値型でない場合: 0
  • 引数
    • dtype: 型情報を含む PyArray_Descr オブジェクト
#include <numpy/ndarray.h>

int main() {
  // 整数型
  PyArray_Descr *dtype_int = PyArray_DescrFromType(NPY_INT);

  // 浮動小数点型
  PyArray_Descr *dtype_float = PyArray_DescrFromType(NPY_FLOAT);

  // 文字列型
  PyArray_Descr *dtype_str = PyArray_DescrFromType(NPY_STRING);

  // 各データ型が数値型かどうか確認
  int is_number_int = PyDataType_ISNUMBER(dtype_int);
  int is_number_float = PyDataType_ISNUMBER(dtype_float);
  int is_number_str = PyDataType_ISNUMBER(dtype_str);

  // 結果を出力
  printf("整数型: %d\n", is_number_int);
  printf("浮動小数点型: %d\n", is_number_float);
  printf("文字列型: %d\n", is_number_str);

  // 後片付け
  PyArray_Descr_DecRef(dtype_int);
  PyArray_Descr_DecRef(dtype_float);
  PyArray_Descr_DecRef(dtype_str);

  return 0;
}

この例では、PyDataType_ISNUMBER() を使って、整数型、浮動小数点型、文字列型のデータ型が数値型かどうかを確認しています。

  • PyDataType_ISNUMBER() は、NumPy のバージョンによって動作が異なる場合があります。詳細については、NumPy のドキュメントを参照してください。
  • PyDataType_ISNUMBER() は、PyArray_Descr オブジェクトの type 属性に直接アクセスするよりも安全です。これは、type 属性は変更される可能性があるためです。


#include <numpy/ndarray.h>

int main() {
  // 数値型と非数値型のデータ型
  PyArray_Descr *dtypes[] = {
    PyArray_DescrFromType(NPY_INT),
    PyArray_DescrFromType(NPY_FLOAT),
    PyArray_DescrFromType(NPY_BOOL),
    PyArray_DescrFromType(NPY_STRING),
    PyArray_DescrFromType(NPY_DATETIME),
    PyArray_DescrFromType(NPY_TIMEDELTA),
  };

  // 各データ型が数値型かどうか確認
  for (int i = 0; i < sizeof(dtypes) / sizeof(dtypes[0]); ++i) {
    PyArray_Descr *dtype = dtypes[i];
    int is_number = PyDataType_ISNUMBER(dtype);

    printf("%s: %d\n", dtype->name, is_number);
  }

  // 後片付け
  for (int i = 0; i < sizeof(dtypes) / sizeof(dtypes[0]); ++i) {
    PyArray_Descr_DecRef(dtypes[i]);
  }

  return 0;
}

このコードを実行すると、以下の出力が得られます。

int: 1
float: 1
bool: 1
string: 0
datetime: 0
timedelta: 0
#include <numpy/ndarray.h>

int main() {
  // 数値型と非数値型のデータ型
  PyArray_Descr *dtypes[] = {
    PyArray_DescrFromType(NPY_INT),
    PyArray_DescrFromType(NPY_FLOAT),
    PyArray_DescrFromType(NPY_BOOL),
    PyArray_DescrFromType(NPY_STRING),
    PyArray_DescrFromType(NPY_DATETIME),
    PyArray_DescrFromType(NPY_TIMEDELTA),
  };

  // 数値型のみのデータ型を含むリスト
  PyArray_Descr *valid_dtypes[3] = {dtypes[0], dtypes[1], dtypes[2]};

  // 数値型のみの要素を持つ配列を作成
  npy_intp dims[] = {10};
  PyArray_Descr *dtype = PyArray_SelectDescr(valid_dtypes, 3);
  NpyArray *arr = PyArray_SimpleNewFromDescr(1, dims, dtype);

  // 配列の内容を表示
  for (int i = 0; i < arr->size; ++i) {
    printf("%d ", ((int *)NpyArray_Ptr(arr))[i]);
  }

  printf("\n");

  // 後片付け
  PyArray_Descr_DecRef(dtype);
  PyArray_Destroy(arr);

  for (int i = 0; i < sizeof(valid_dtypes) / sizeof(valid_dtypes[0]); ++i) {
    PyArray_Descr_DecRef(valid_dtypes[i]);
  }

  return 0;
}
1 2 3 4 5 6 7 8 9 10


PyArray_IS_NUMERIC() マクロ

PyArray_IS_NUMERIC() マクロは、PyArray_Descr オブジェクトが数値型かどうかを判定します。PyDataType_ISNUMBER() と同様に、1 を返せば数値型、0 を返せば非数値型となります。

#include <numpy/ndarray.h>

int main() {
  // 整数型
  PyArray_Descr *dtype_int = PyArray_DescrFromType(NPY_INT);

  // 判断結果
  int is_numeric_int = PyArray_IS_NUMERIC(dtype_int);

  // 結果を出力
  printf("整数型: %d\n", is_numeric_int);

  // 後片付け
  PyArray_Descr_DecRef(dtype_int);

  return 0;
}

PyArray_ObjectType() 関数

PyArray_ObjectType() 関数は、PyArray_Descr オブジェクトが特定の型かどうかを判定します。この関数は、数値型かどうかだけではなく、整数型、浮動小数点型、複素数型など、より詳細な型判定に使用できます。

#include <numpy/ndarray.h>

int main() {
  // 整数型
  PyArray_Descr *dtype_int = PyArray_DescrFromType(NPY_INT);

  // 判断結果
  int is_integer = PyArray_ObjectType(dtype_int, NPY_INTEGER);

  // 結果を出力
  printf("整数型: %d\n", is_integer);

  // 後片付け
  PyArray_Descr_DecRef(dtype_int);

  return 0;
}

手動チェック

PyArray_Descr オブジェクトの type 属性や kind 属性などを直接チェックすることで、データ型が数値型かどうかを判断することもできます。

#include <numpy/ndarray.h>

int main() {
  // 整数型
  PyArray_Descr *dtype_int = PyArray_DescrFromType(NPY_INT);

  // 型情報
  char type = dtype_int->type;
  char kind = dtype_int->kind;

  // 判断結果
  int is_numeric = (type == NPY_INT) || (type == NPY_FLOAT) || (type == NPY_COMPLEX);

  // 結果を出力
  printf("整数型: %d\n", is_numeric);

  // 後片付け
  PyArray_Descr_DecRef(dtype_int);

  return 0;
}

上記以外にも、NumPy の拡張モジュールやサードパーティ製のライブラリなどを利用して、データ型判定を行う方法があります。

最適な方法の選択

使用する方法は、状況によって異なります。

  • 柔軟性が必要な場合は、手動チェックを行います。
  • より詳細な型判定が必要な場合は、PyArray_ObjectType() 関数を使用します。
  • シンプルで高速な判定が必要な場合は、PyDataType_ISNUMBER() または PyArray_IS_NUMERIC() マクロがおすすめです。