【发布时间】:2020-06-09 09:06:31
【问题描述】:
我无法运行矢量化 ufunc。常规 @njit 工作正常,@vectorize documentation 表明矢量化装饰器与 njit 相同。我在 Windows 10 上运行,如果这有影响的话
演示程序如下。从下面的输出中我们可以看到,njit 函数运行正常,并且向量化函数存在类型错误。
import sys
import numpy
import numba
Structured = numpy.dtype([("a", numpy.int32), ("b", numpy.float64)])
numba_dtype = numba.from_dtype(Structured)
@numba.njit([numba.float64(numba_dtype)])
def jitted(x):
x['b'] = 17.5
return 18.
@numba.vectorize([numba.float64(numba_dtype)], target="cpu", nopython=True)
def vectorized(x):
x['b'] = 17.5
return 12.1
print('python version = ', sys.implementation.version)
print('numpy version = ', numpy.__version__)
print('numba version = ', numba.__version__)
for struct in numpy.empty((3,), dtype=Structured):
print(jitted(struct))
print(vectorized(numpy.empty((3,), dtype=Structured)))
输出是
python 版本 = sys.version_info(major=3, minor=7, micro=1, releaselevel='final', serial=0)
numpy 版本 = 1.17.3
numba 版本 = 0.48.0
18.0
18.0
18.0
Traceback(最近一次调用最后一次):文件“scratch.py”,第 49 行,在
print(vectorized(numpy.empty((3,), dtype=Structured))) TypeError: ufunc 'vectorized' not supported for the input types, and the input can not besecurely coerced to any supported types based on the cast rule ' '安全''
【问题讨论】:
-
我没有使用过这个
numba.vectorize,但文档说它创建了一个ufunc(类似)函数。ufunc返回一个新数组;他们不会就地运作。我意识到这只是一个测试功能,但是使用x=np.empty(3,), dtype=Structured),x['b'] = 17.5在没有numba的情况下也可以正常工作。 -
我无法使用
vectorize和这个 dtype。我不知道有任何numpy.ufunc可以使用结构化数据类型。你可能需要退后一步,解释你为什么需要这个。你的目标是什么? -
Numba docs 提到支持 Numpy 结构化标量,支持类型的 Numpy 数组也是如此。此外,我在@vectorize docs 中没有看到相反的内容。我目前的目标是要么弄清楚如何让这个例子工作,要么理解为什么它不工作。我正在探索其他方法,但向量化结构化数组是这个特定问题的研究主题。
-
问题可能与
numpy's自己处理ufunc中的结构化数据类型有关。例如,我找到了关于编写自己的 ufunc 的这一部分:docs.scipy.org/doc/numpy-1.13.0/user/…。numba可能没有处理所需的详细信息。 -
我认为您可能是正确的...我在 github 中打开了一个 issue。我看看那边有没有回复。
标签: python numpy vector numba structured-array