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 数组不适合,因为事先不知道元素的数量,
- 一个 numpy 向量列表需要太多的数字索引,这是我试图避免的
- dicts 列表(据说)占用太多内存
- 与上面列出的任何其他变体相比,一个 numpy 的 jited 类数组太慢了。
更新: 到目前为止我能得到的最远点是:
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'