NumPy C-APIにおける「enumerator NPY_FLOAT64」の解説とサンプルコード


NPY_FLOAT64 は、NumPy C-API で定義されている列挙体であり、64ビット浮動小数点数を表します。これは、NumPy 配列のデータ型を指定するために使用されます。

詳細

  • IEEE 754 浮動小数点規格に準拠しています。
  • データサイズは 8 バイトです。
  • C 言語での型名は npy_float64 です。
  • 対応する Python データ型は numpy.float64 です。
  • NPY_FLOAT64 は、npy_types.h ヘッダーファイルで定義されています。

使い方

NPY_FLOAT64 は、NumPy 配列のデータ型を指定するために使用できます。たとえば、次のように npy_array 関数を使用して 64ビット浮動小数点数配列を作成できます。

npy_intp dims[] = {2, 3};
npy_float64 data[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};
PyArrayObject *arr = PyArray_NewFromDescr(&PyArray_Descr(NPY_FLOAT64), dims, 2, NPY_CORDER, data, NULL, NULL, NULL, NULL, 0);

このコードは、次の Python コードと同じです。

import numpy as np

arr = np.array([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], dtype=np.float64)
  • PyArray_FLOAT64_Copy: NPY_FLOAT64 型の配列をコピーします。
  • PyArray_FLOAT64_ArrCheck: 配列が NPY_FLOAT64 型かどうかを確認します。
  • PyArray_Double_AsPyFloat: NPY_FLOAT64 型の値を Python の浮動小数点に変換します。
  • PyArray_PyFloat_AsDouble: Python の浮動小数点数を NPY_FLOAT64 型に変換します。

次のコードは、NPY_FLOAT64 型の配列を Python のリストに変換する方法を示しています。

npy_intp dims[] = {2, 3};
npy_float64 data[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};
PyArrayObject *arr = PyArray_NewFromDescr(&PyArray_Descr(NPY_FLOAT64), dims, 2, NPY_CORDER, data, NULL, NULL, NULL, NULL, 0);

PyObject *list = PyArray_ToList(arr);
if (list == NULL) {
    PyErr_Print();
    Py_DECREF(arr);
    return NULL;
}

Py_DECREF(arr);
return list;
import numpy as np

arr = np.array([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], dtype=np.float64)
list = arr.tolist()


配列の作成

#include <numpy/ndarray.h>

int main() {
  npy_intp dims[] = {2, 3};  // 2 行 3 列の配列を作成します
  npy_float64 data[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};  // 配列の要素を設定します
  PyArrayObject *arr = PyArray_NewFromDescr(&PyArray_Descr(NPY_FLOAT64), dims, 2, NPY_CORDER, data, NULL, NULL, NULL, NULL, 0);

  if (arr == NULL) {
    PyErr_Print();
    return 1;
  }

  // 以下で、作成した配列 `arr` を使用することができます
  // ...

  Py_DECREF(arr);  // 使用が終わったら、配列を解放します
  return 0;
}

配列への要素のアクセス

#include <numpy/ndarray.h>

int main() {
  npy_intp dims[] = {2, 3};
  npy_float64 data[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};
  PyArrayObject *arr = PyArray_NewFromDescr(&PyArray_Descr(NPY_FLOAT64), dims, 2, NPY_CORDER, data, NULL, NULL, NULL, NULL, 0);

  if (arr == NULL) {
    PyErr_Print();
    return 1;
  }

  // (0, 0) 要素へのアクセス
  npy_float64 value = *(npy_float64 *)PyArray_GETPTR1(arr, 0, 0);
  printf("arr[0, 0] = %f\n", value);

  // (1, 2) 要素へのアクセス
  value = *(npy_float64 *)PyArray_GETPTR1(arr, 1, 2);
  printf("arr[1, 2] = %f\n", value);

  Py_DECREF(arr);
  return 0;
}

配列の形状とストライドの取得

#include <numpy/ndarray.h>

int main() {
  npy_intp dims[] = {2, 3};
  npy_float64 data[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};
  PyArrayObject *arr = PyArray_NewFromDescr(&PyArray_Descr(NPY_FLOAT64), dims, 2, NPY_CORDER, data, NULL, NULL, NULL, NULL, 0);

  if (arr == NULL) {
    PyErr_Print();
    return 1;
  }

  // 配列の形状を取得
  npy_intp ndims = PyArray_NDIM(arr);
  for (int i = 0; i < ndims; i++) {
    printf("dim %d: %ld\n", i, PyArray_DIM(arr, i));
  }

  // 配列のストライドを取得
  npy_intp *strides = PyArray_STRIDES(arr);
  for (int i = 0; i < ndims; i++) {
    printf("stride %d: %ld\n", i, strides[i]);
  }

  Py_DECREF(arr);
  return 0;
}
#include <numpy/ndarray.h>

int main() {
  npy_intp dims[] = {2, 3};
  npy_float64 data[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};
  PyArrayObject *arr = PyArray_NewFromDescr(&PyArray_Descr(NPY_FLOAT64), dims, 2, NPY_CORDER, data, NULL, NULL, NULL, NULL, 0);

  if (arr == NULL) {


代替方法

  1. 型名 npy_float64 の使用

NPY_FLOAT64 は単なる列挙体ではなく、npy_float64 という型名も定義されています。これは、NPY_FLOAT64 の値を格納するために使用できる C 言語の型です。

npy_float64 value = 1.0;  // 64 ビット浮動小数点数型の変数 `value` を宣言
  1. PyArray_Descr 構造体の使用

PyArray_Descr 構造体は、NumPy 配列のデータ型を記述するために使用されます。NPY_FLOAT64 は、この構造体の type メンバで定義されている定数です。

PyArrayDescr *descr = PyArray_DescrNew(&PyArray_Descr(NPY_FLOAT64));  // 64 ビット浮動小数点数のデータ型を記述する `PyArrayDescr` 構造体を作成
  1. 文字列 "f8" の使用

NumPy C-API では、データ型を文字列で表すこともできます。NPY_FLOAT64 は、"f8" という文字列で表されます。

PyArrayObject *arr = PyArray_SimpleNewFromDescr(2, dims, "f8");  // "f8" をデータ型として、2 行 3 列の NumPy 配列を作成

状況に応じた選択

どの代替方法を使用するかは、状況によって異なります。

  • 文字列 "f8" は、簡潔でわかりやすい方法でデータ型を指定する場合に使用できます。
  • PyArray_Descr 構造体は、より複雑なデータ型を記述する必要がある場合に使用できます。
  • 型名 npy_float64 は、NPY_FLOAT64 よりも簡潔で読みやすいコードを作成するために使用できます。