【发布时间】:2021-09-26 04:16:57
【问题描述】:
我有一个示例代码来说明我的问题。如果你运行:
import numpy as np
from numba import jit
@jit(nopython=True)
def test():
arr = np.array([[[11, 12, 13], [11, 12, 13]], [[21, 22, 23], [21, 22, 23]]])
arr2 = arr[:, 0, :]
arr3 = arr2.argsort()
print(arr3)
test()
它会失败:
numba.core.errors.TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Invalid use of BoundFunction(array.argsort for array(int64, 2d, A)) with parameters ()
During: resolving callee type: BoundFunction(array.argsort for array(int64, 2d, A))
During: typing of call at /home/stark/Work/mmr6/test.py (41)
File "test.py", line 41:
def test():
<source elided>
arr3 = arr2.argsort()
^
argsort 应该在最后一个轴上进行 argsort。本质上它应该给我:
>>>
[[0 1 2]
[0 1 2]]
我认为复制arr2 数组(使用copy())可以解决问题,因为它会使数组在内存中连续(而不是视图),但是除了arr2 的类型之外,它会失败并显示相同的消息现在消息中的 array(int64, 2d, C) 符合预期。
为什么会失败,我该如何解决?
【问题讨论】:
-
numba 真的很糟糕,我过去用过它,有一半的时间它会抛出错误,无法将代码编译成 C。它在@987654328 行失败的原因@是因为它不理解如何将numpy编译成C代码。
-
我的建议是根本不要使用 numba,numpy 已经是一个非常优化的库,所以无论如何都不需要它。
-
numba 不完全支持多维数组。使用 nd-arrays 时有些事情会起作用,但很多事情不会并且会抱怨“非连续数组”
-
@Vinzent 它不...?我记得过去用
@njit使用它们。 -
@MateenUlhaq 一些(一些)事情有效,但很多其他事情却没有。