0
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'
4

1 に答える 1