使用numba处理和操作numpy数组

4

Numba的jit为什么不能编译一个简单的Numpy数组操作?

这是一个最小的不起作用的示例,可以重现Numba无法编译的情况。

import numpy as np
from numba import jit

rows = 10
columns = 999999
A = np.empty((rows, columns))
b = np.linspace(0, 1, num=rows)

@jit(nopython=True)
def replicate(A, b):
    for i in range(A.shape[1]):
        A[:, i] = b
    return A #optional

replicate(a, b)

With the following error:

TypingError: Failed at nopython (nopython frontend)
Cannot resolve setitem: array(float64, 1d, C, nonconst)[(slice3_type, int64)] = array(float64, 1d, C, nonconst)
File "<ipython-input-32-db24fbe2922f>", line 12

我做错了什么吗?

另外,我需要使用nopython模式,因为在我的实际情况中,我需要频繁执行数组加法、标量乘法和用其他数组填充数组。我的理解是,在对象模式下,我将无法进行循环jitting,因此我不会在执行速度上看到任何真正的性能提升。

1个回答

2
Numba在nopython模式下不支持numpy切片。请尝试显式展开循环:
rows = 10
columns = 999999
a = np.empty((rows, columns))
b = np.linspace(0, 1, num=rows)

@jit(nopython=True)
def replicate(A, b):
    for i in xrange(A.shape[0]):
        for j in xrange(A.shape[1]):
            A[i, j] = b[i]
    return A #optional

replicate(a, b)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接