Cython中动态数组的创建

4
有没有一种不使用可怕的malloc+pointer+free巧妙解决方法,在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)创建一个二维numpy数组,其中第二个维度的大小由输入数组中最大的数组确定。这将浪费一些空间,但是易于操作且高效。您可以使用“zeros”函数创建一个全零的二维数组,然后只需填充所需的条目即可。如下所示,这是“选项1”。
2)创建一个嵌套的numpy数组,其中“lookup2 [i]”是由“input [i]”中元素数量定义大小的一维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]

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