Python 3.x 如何解决JAX/Python中的ValueError`vector::reserve`?

Python 3.x 如何解决JAX/Python中的ValueError`vector::reserve`?,python-3.x,numpy,jax,Python 3.x,Numpy,Jax,编辑:GitHub问题此处: 我正在尝试使用jit优化以下函数: @partial(jit,静态参数=(0,1,) def cocurrence\u helper(对:np.array,label\u map:Dict)->lil\u矩阵: uniques=lil_矩阵(np.zeros((len(label_映射),len(label_映射))).astype(“int32”)) 对于成对项目: 如果项目[0]=项目[1]: 唯一性[标签映射[项目[0]],标签映射[项目[1]]]+=1 返回

编辑:GitHub问题此处:

我正在尝试使用jit优化以下函数:

@partial(jit,静态参数=(0,1,)
def cocurrence\u helper(对:np.array,label\u map:Dict)->lil\u矩阵:
uniques=lil_矩阵(np.zeros((len(label_映射),len(label_映射))).astype(“int32”))
对于成对项目:
如果项目[0]=项目[1]:
唯一性[标签映射[项目[0]],标签映射[项目[1]]]+=1
返回单
此处使用上述例程:

def\u获得成对频率(
数据:pd.DataFrame,交叉表=False
)->pd.DataFrame:
values=data.stack()
values.index=values.index.droplevel(1)
values.name=“vals”
values=优化(values.to_frame())
pair=优化(values.join(values,rsuffix=“\u 2”))
label_map=dict()
对于lbl,枚举中的每个值(values.vals.unique()):
label_map[每个]=lbl
如果不是交叉表:
freq=coocurrence\u helper(pairs=pair.values,label\u map=label\u map)
return((freq/freq.sum(1.ravel()).astype(np.float32))
其他:
频率=pd.交叉表(对[“VAL”],对[“VAL_2”])
self.index=freq.index
返回csr_矩阵((freq/freq.sum(1)).astype(np.float32))
但我得到了以下错误:

---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在里面
---->1.获得成对频率(数据)
成对输入频率(数据、交叉表)
25标签\u地图[每个]=磅
26如果不是交叉表:
--->27 freq=coocurrence\u helper(pairs=pair.values,label\u map=label\u map)
28返回csr_矩阵((freq/freq.sum(1.ravel()).astype(np.float32))
29.其他:
~/anaconda3/envs/tensorflow2_p36/lib/python3.6/site-packages/jax/api.py in f_jitted(*args,**kwargs)
369返回缓存未命中(*args,**kwargs)[0]#可能不会返回
370其他:
-->371返回cpp_jitted_f(*args,**kwargs)
372 f_jitted._cpp_jitted_f=cpp_jitted_f
373
ValueError:vector::reserve
问题的根源是什么?如果不使用
static\u argnums
,则会显示错误消息

RuntimeError:无效参数:未知NumPy类型O大小8

使用相同的回溯。

问题是您返回的是一个
scipy.sparse.lil_矩阵
,它不是有效的JAX类型。JAX
jit
decorator不能用作任意Python代码的编译器;它旨在优化JAX阵列上的操作序列

在这种情况下,最好的方法可能是从函数中删除
@partial(jit,…)
装饰器;如果您想在这里使用JAX jit编译,那么首先必须重写代码以避免
scipy.sparse
矩阵,并使用JAX数组