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) {
代替方法
- 型名 npy_float64 の使用
NPY_FLOAT64
は単なる列挙体ではなく、npy_float64
という型名も定義されています。これは、NPY_FLOAT64
の値を格納するために使用できる C 言語の型です。
npy_float64 value = 1.0; // 64 ビット浮動小数点数型の変数 `value` を宣言
- PyArray_Descr 構造体の使用
PyArray_Descr
構造体は、NumPy 配列のデータ型を記述するために使用されます。NPY_FLOAT64
は、この構造体の type
メンバで定義されている定数です。
PyArrayDescr *descr = PyArray_DescrNew(&PyArray_Descr(NPY_FLOAT64)); // 64 ビット浮動小数点数のデータ型を記述する `PyArrayDescr` 構造体を作成
- 文字列 "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
よりも簡潔で読みやすいコードを作成するために使用できます。