如何使用numba的guvectorize函数实现以下功能:1)遍历数组; 2)使用numpy函数; 3)输出2个数组

时间:2019-05-10 21:00:04

标签: python numba

我使用numba的guvectorize编写了此代码,其target ='parallel'效果很好。我想使用target ='cuda'运行具有相同功能的代码,但是遇到很多问题。

我知道有一项政策规定不要在一个帖子中问多个问题,但可以分为多个部分,这就是其中之一。

可以正常工作的代码如下:

import numpy as np
from numba import vectorize, cuda, jit, njit, prange, float64, float32, int64, guvectorize

starting_size = 20
number_of_tumors = 5
time_interval = 5

@jit(nopython=True)
def make_array(number_of_rows, row_size, starting_size):
    q = (0 * np.arange(number_of_rows*row_size) ).reshape(number_of_rows,row_size)
    q[:,0]=starting_size
    return(q)

array = (make_array(number_of_tumors, time_interval, starting_size))

@jit(nopython=True)
def make_variable_arrays(array):
    array_of_zeros = (0 * np.arange(array.shape[0]*array.shape[1]) ).reshape(array.shape[0],array.shape[1])
    shedding_array = array_of_zeros
    return(shedding_array)

shedding_array = make_variable_arrays(array)

@guvectorize([(int64[:], int64[:], int64[:], int64[:])], '(n),(n)->(n),(n)', target = 'parallel')

def g(x, y, res, res_two):
    res = x
    res_two = y
    for i in range(x.shape[0]-1):
        shedding_var = np.random.poisson(( 4 * ((x[i])**.01)       ),1)[0]
        res_two[i] = shedding_var
        res[i+1] = res[i] + shedding_var

g(array,shedding_array)
print(array)
print(shedding_array)

这将遍历“数组”的行,并使每行中的下一个值成为行中的前一个值,以及生成的numpy poisson随机变量。

将目标更改为“ cuda”时,出现错误:

assert len(self.outputsig)== 1,“仅支持1个输出” AssertionError:仅支持1个输出

我认为这意味着我只能更改1个数组,而使用cuda则不能更改2个数组。

为了弄清楚如何开始解决此问题,我制作了一个新函数,仅接受和更改一个数组。如下:

array = (make_array(number_of_tumors, time_interval, starting_size))
 @guvectorize([(int64[:], int64[:])], '(n)->(n)', target = 'parallel')

def g(x, res):
    res = x
    for i in range(x.shape[0]-1):
        shedding_var = np.random.poisson(( 4.02 * ((x[i])**.01)       ),1)[0]
        #shedding_var = 2
        res[i+1] = res[i] + shedding_var

g(array)
print(array)

所以,我遇到了几个问题。

1)当我写target ='cuda'时,出现此错误:

enter image description here

那么,我可以在带有guvectorize装饰器的函数中甚至使用numpy函数吗?

2)当我摆脱np.random.poisson函数,而只是将shedding_var设置为2时,该函数运行良好。它会改变

enter image description here

enter image description here

但是当我将更改目标设为“ cuda”时,数组不变,它停留在

enter image description here

在函数g之前和之后。因此,不仅不能使用numpy poisson函数,而且不能使该函数遍历数组。

3)即使前面的两个问题都解决了,也有办法让函数像我的第一个函数那样在两个数组上操作,或者至少有一个数组的输入但输出两个数组吗?

0 个答案:

没有答案