有没有办法在cython中动态创建数组而不使用malloc
+ pointer
+ free
的可怕丑陋的kludge?对于这个非常基本的功能,必须有一些引用计数,垃圾收集包装。
我需要这个来实现一个不规则的数组。
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]])
答案 0 :(得分:1)
如果我理解正确,至少有两种方法可以做你想做的事情:
1)创建一个二维numpy数组,其中第二维的大小由最大的输入数组固定。这将浪费一些空间,但是简单而有效。您可以使用zeros
函数创建一个充满零的2-dim数组,然后只填充所需的条目。这在下面显示为选项1 。
2)创建一个嵌套的numpy数组,其中lookup2[i]
是一个1-dim numpy数组,其大小由input[i]
中的元素数定义。这也很简单,但效率较低,因为内部数组存储为通用 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]