2014-06-18 24 views
0

列表索引錯誤我是新來numba/numbapro。我試圖運行的一個例子,這一個關於廣義Ufuncs與guvectorize:與numba guvectorize

(下面的鏈接爲例):http://docs.continuum.io/numbapro/quickstart.html#numbapro-guvectorize

import numbapro as numbapro 

@numbapro.guvectorize(['void(int32[:], int32[:])'], '(n)->()') 
def sum_row(inp, out): 
    """ 
    Sum every row 

    function type: two arrays 
        (note: scalar is represented as an array of length 1) 
    signature: n elements to scalar 
    """ 
    tmp = 0. 
    for i in range(inp.shape[0]): 
     tmp += inp[i] 
    out[0] = tmp 

我得到這個錯誤:

IndexError        Traceback (most recent call last) 
<ipython-input-98-79514a184595> in <module>() 
----> 1 @numbapro.guvectorize(['void(int32[:], int32[:])'], '(n)->()') 
     2 def sum_row(inp, out): 
     3  """ 
     4  Sum every row 
     5 

/users/adelacalle/anaconda_linux/lib/python2.7/site-packages/numba/npyufunc/decorators.pyc in wrap(func) 
    117   for fty in ftylist: 
    118    guvec.add(fty) 
--> 119   return guvec.build_ufunc() 
    120 
    121  return wrap 

/users/adelacalle/anaconda_linux/lib/python2.7/site-packages/numba/npyufunc/ufuncbuilder.pyc in build_ufunc(self) 
    149 
    150   for sig, cres in self.nb_func.overloads.items(): 
--> 151    dtypenums, ptr = self.build(cres) 
    152    dtypelist.append(dtypenums) 
    153    ptrlist.append(utils.longint(ptr)) 

/users/adelacalle/anaconda_linux/lib/python2.7/site-packages/numba/npyufunc/ufuncbuilder.pyc in build(self, cres) 
    167   signature = cres.signature 
    168   wrapper = build_gufunc_wrapper(ctx, cres.llvm_func, signature, 
--> 169          self.sin, self.sout) 
    170   ctx.engine.add_module(wrapper.module) 
    171   ptr = ctx.engine.get_pointer_to_function(wrapper) 

/users/adelacalle/anaconda_linux/lib/python2.7/site-packages/numba/npyufunc/wrappers.pyc in build_gufunc_wrapper(context, func, signature, sin, sout) 
    143  for i, (typ, sym) in enumerate(zip(signature.args, sin + sout)): 
    144   ary = GUArrayArg(context, builder, arg_args, arg_dims, arg_steps, i, 
--> 145       step_offset, typ, sym, sym_dim) 
    146   step_offset += ary.ndim 
    147   arrays.append(ary) 

/users/adelacalle/anaconda_linux/lib/python2.7/site-packages/numba/npyufunc/wrappers.pyc in __init__(self, context, builder, args, dims, steps, i, step_offset, typ, syms, sym_dim) 
    207   self.array = arycls(context, builder) 
    208   self.array.data = builder.bitcast(self.data, self.array.data.type) 
--> 209   self.array.shape = cgutils.pack_array(builder, self.shape) 
    210   self.array.strides = cgutils.pack_array(builder, self.strides) 
    211   self.array_value = self.array._getpointer() 

/users/adelacalle/anaconda_linux/lib/python2.7/site-packages/numba/cgutils.pyc in pack_array(builder, values) 
    257 def pack_array(builder, values): 
    258  n = len(values) 
--> 259  ty = values[0].type 
    260  ary = Constant.undef(Type.array(ty, n)) 
    261  for i, v in enumerate(values): 

IndexError: list index out of range 

我沒有找到比這個鏈接更多的文檔。難道我做錯了什麼?我發現在簽名中有一個空支架時會發生這種情況。 我在Linux機器上運行此,我numbapro的版本是提前0.14.1

感謝,

亞歷

回答

0

最後我自己來到了一個結論。你可以分配一個由n個元素組成的實際數組,所以你可以寫成一個簽名'(n) - >(n)'而不是'(n) - >()'。文檔中必須存在錯誤,或者已過時。

然而,這不是有效的,因爲我們有整個數組分配,這將是浪費內存(雖然它的作品!)。更重要的是,使用guvectorize將整個數組中的元素進行求和,這可能是最好,最簡單,最有效的方法,所以我使用@jit。

亞歷