performance - cython 中的动态数组创建

标签 performance numpy cython

有没有办法在 cython 中动态创建数组而不使用 malloc + pointer + free ?对于这个非常基本的功能,必须有一些引用计数、垃圾收集包装器。

我需要这个来实现一个参差不齐的数组。

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) 创建一个二维 numpy 数组,其中第 2 维的大小由最大的输入数组固定。这会浪费一些空间,但很容易,也很有效。您可以使用 zeros函数来创建一个充满零的二维数组,然后只填充所需的条目。这在下面显示为选项 1。

2)创建嵌套的numpy数组,其中lookup2[i]是一个大小由 input[i] 中的元素数定义的 1 维 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]

关于performance - cython 中的动态数组创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19583382/

相关文章:

python - Cython + OpenCV 和 NumPy

python - cython 何时使用 'compile time' 类型

javascript - 如何在运行时禁用 select2 中的选项

android - 使用 andengine 在动态壁纸中显示当前时间的最佳方式是什么?

performance - 提高 4G 网络数据速率的各种选项有哪些?

python - 给定置换数组,找到置换

mysql - 优化sql查询

python - 改变值检测 numpy Python

python - 如何获得ndarray的元素平均值

python - 如何使用 Cython 将 python 函数作为参数传递给 c++ 函数