2013-10-26 92 views
5

我可以定義一個numba結構類型:如何從一個numba結構類型創建一個結構體?

from numba import struct, int32 

my_struct_type = struct([('value_a', int32), ('value_b', int32)]) 

現在我有型,我如何創建一個實際的結構?

+7

您提交了一個針對'numba'的文檔錯誤,讓它們告訴你;-) –

+0

聲音非常合理。在這裏,有一個upmod! :) –

回答

2

numba.struct不再存在,您現在可以簡單地通過標準numpy陣列與您自定義的複雜dtype ....

import numpy as np # version 1.10.1 
import numba # version 0.22.1 

@numba.jit(nopython=True) 
def sum_basic_array(a): 
    ret = 0 
    for aa in a: 
     ret += aa 
    return ret 

@numba.jit(nopython=True) 
def sum_struct_array(a): 
    ret = 0 
    for aa in a: 
     ret += aa.sub_0 
    return ret 

x_basic = np.arange(20000*3, dtype=np.uint32) 
x_struct = x_basic.view(dtype=np.dtype([('sub_0', np.int32), 
             ('sub_1', np.float64)])) 

%timeit sum_basic_array(x_basic) # 18 µs 
%timeit sum_struct_array(x_struct) # 8 µs 
%timeit sum_struct_array(x_struct.view(np.recarray)) # 40 µs 

注意,sum_struct_array是做三分之一儘可能多的迭代,所以它不應該是一個驚喜,它的速度更快。

1

一個例子可以在Numba documentation

record_type = struct([('x', double), ('y', double)]) 
record_dtype = record_type.get_dtype() 
a = numpy.array([(1.0, 2.0), (3.0, 4.0)], dtype=record_dtype) 

找到您所創建的結構是一個numpy的data type object,而不是真正的新類型在Python

對於您的代碼示例,這將是:

my_struct_type = struct([('value_a', int32), ('value_b', int32)]) 
my_struct = np.array([(1, 2)], dtype=my_struct_type) 
相關問題