2013-10-25 47 views
3

有没有什么办法可以动态创建数组在cython中,而不使用可怕的难看的kludge malloc + pointer + free?必须有一些 refcounting,垃圾收集包装这个非常基本的功能。在cython动态数组创建

我需要这个来实现一个衣衫褴褛的数组。

inputs=[arr1,arr2,arr3,...] 
... 
NELEMENTS=len(inputs) 
cdef np.ndarray[double,2] lookup[NELEMENTS] #<--- this is where I'm stuck 
for i in range(NELEMENTS): 
    lookup[i]=inputs[i] 

# data.shape =((5000,NELEMENTS)) 
for i in range(data.shape[0]): 
    for j in range(data.shape[1]): 
     do_something(lookup[j,data[i,j]]) 

回答

1

如果我理解正确的话,也有做的至少2种方式,你想要什么:

1)创建一个2维numpy的数组,其中第2维的大小是由最大的固定你的输入数组。这会浪费一些空间,但很容易,而且高效。您可以使用zeros函数创建一个2点阵列,并且只填充所需的条目。这在下面显示为选项1

2)创建一个嵌套numpy数组,其中lookup2[i]是由input[i]中的元素数定义的1-dim numpy数组。这也是直接的,但效率较低,因为内部数组被存储为通用的Python对象。

inputs = [ [1] ,[2,3,4], [5,6], [7,8,9,10,11,12]] 
NELEMENTS=len(inputs) 

# Option 1: create 2-dim numpy array full of zeros, and only populate necessary 
# parts 
maxInputSize = max([len(x) for x in inputs]) 

cdef np.ndarray[double,ndim=2] lookup = np.zeros((NELEMENTS, maxInputSize)) 

for i in range(NELEMENTS): 
    for j in range(len(inputs[i])): 
     lookup[i][j] = inputs[i][j] 

# Option 2: create nested numpy array 
cdef np.ndarray[object, ndim=1] lookup2 = np.empty((NELEMENTS,), dtype='object') 

for i in range(NELEMENTS): 

    nInputs = len(inputs[i]) 
    lookup2[i] = np.zeros(nInputs) 

    for j in range(nInputs): 
     lookup2[i][j] = inputs[i][j]