import numpy as np
from numba import njit
dt = np.dtype([('x', np.float64), ('y', np.float64)])
@njit
def f():
# a = np.zeros(2, dtype=dt) # this works
# return a['x']
b = np.array((0.5, 1.5), dtype=dt) # this doesn't
# return b['x']
f()
エラーメッセージは
NotImplementedError: Cannot cast float64 to Record(x[type=float64;offset=0],y[type=float64;offset=8];16;False): %".69" = phi double [%".70", %"switch.0"], [%".72", %"switch.1"]
@jit がなくても問題なく動作します。
私が本当に達成しようとしているのは、カスタム dtype スカラーのリストを作成することです。私は次の代替案を試しました:
- 要素数が事前にわからないため、numpy 配列は適切ではありません。
- でこぼこのベクトルのリストには、あまりにも多くの数値インデックスが必要です。これは私が避けようとしているものです
- 辞書のリストは (おそらく) 大量のメモリを消費します
- jitted クラスの numpy 配列は、上記の他のバリアントに比べて遅すぎます。
更新: これまでに取得できた最も遠いポイントは次のとおりです。
dt = np.dtype([('x', np.float64), ('y', np.float64)])
@nb.njit
def f():
a = np.array((0.5, 1.5))
b = a.view(dt)
return b.x
f()
array([0.5])
ただし、これはスカラーではなく、サイズが 1 の配列です (@jit の有無にかかわらず)。
アップデート2:
Recfunctions はまだ numba でカバーされていません。
from numpy.lib import recfunctions
from numba import njit
dt = np.dtype([('x', np.float64), ('y', np.float64)])
@njit
def f():
a = np.array((1,2))
b = recfunctions.unstructured_to_structured(a, dt)
return b['x']
f()
Unknown attribute 'unstructured_to_structured' of type
Module(<module 'numpy.lib.recfunctions'