我正在努力解决 numba 错误
Untyped global name 'is_a_subset': Cannot determine Numba type of <class 'numba.np.ufunc.gufunc.GUFunc'>
这通常意味着我摸索并使用了 numba 不支持的方法。以下代码失败。
@guvectorize("(n),(n)->(n)",nopython=True)
def is_a_subset(x,y,out):
out[:]=np.array([item in x for item in y])
@njit()
def test(x,y,z):
is_a_subset(x,y,z)
return z.mean()
x=np.array([[1,2,3],[3,2,1]])
y=np.array([[3,6,1],[1,2,3]])
z = np.empty_like(x)
test(x,y,z)
Run Code Online (Sandbox Code Playgroud)
然而,删除测试功能上的 njit 会使一切正常。
def test(x,y,z):
is_a_subset(x,y,z)
return z.mean()
Run Code Online (Sandbox Code Playgroud)
为什么 numba 在非 python 模式下难以解析类型?
我也尝试过没有不同的结果
@guvectorize(["f8[:],f8[:],f8[:]"],"(n),(n)->(n)",nopython=True)
def is_a_subset(x,y,out):
out[:]=np.array([item in x for item in y])
Run Code Online (Sandbox Code Playgroud) 尝试标准化数据框中的所有行,以便
A B C A B C
1 2 4 => 1 .3 .6
2 2 5 2 .3 .7
3 4 6 3 .4 .6
Run Code Online (Sandbox Code Playgroud)
这会返回一个警告,表明它正在强制转换为整数
outdf <- df[, names(df) := (.SD / rowSums(.SD)), .SDcols=x,by=y]
Run Code Online (Sandbox Code Playgroud)
这没有任何作用
outdf <- df[, names(df) := as.numeric(x)][,x:=(.SD / rowSums(.SD)), .SDcols=x,by=y][]
Run Code Online (Sandbox Code Playgroud)
这些都很接近。有没有更好的方法来改变类型或者更好的方法来规范化。(进入这一行的数据约为 42GB,因此 data.table 是正确的选择)
编辑:
x 和 y
x <- names(data)[14:ncol(data)]
y <- names(data)[1]
Run Code Online (Sandbox Code Playgroud)