我有一个看起来像这样的C代码:(原始代码实际测试 malloc() 返回NULL)
1 #include
2 #include // (Not sure if right import)
3 #include
4 #include
5
6 double *calculate_dW(npy_intp *dim_w) {
7 int i;
8 double* data = (double*)malloc(sizeof(double) * dim_w[0]);
9
10 /* Inserts some dummy data */
11 for (i = 0; i < dim_w[0]; i++)
12 data[i] = i;
13
14 return data;
15 }
然后是一个将它包装在函数中的Cython代码:
1 import cython
2 import numpy as np
3 cimport numpy as np
4
5 cdef extern double *calculate_dW(np.npy_intp *dim_w)
6
7 def run_calculate_dW(np.ndarray[np.npy_intp, ndim=1, mode="c"] dim_w):
8 print("Will call calculate_dW")
9 cdef double *dW = calculate_dW(&dim_w[0])
10
11 print("Will call PyArray_SimpleNewFromData")
12 ret = np.PyArray_SimpleNewFromData(
13 1,
14 &dim_w[0],
15 np.NPY_FLOAT64,
16 dW)
17 print("Will print")
18 print(ret)
19 print("Will return")
20 return ret
我测试的是哪个
# runTest.py
1 import numpy as np
2 import multiply
3 a = np.array((10,)) # as expected, using `np.array(10)` won't work
4 print a
5 multiply.run_calculate_dW(a)
并获得以下输出
$ PYTHONPATH=build/lib.linux-x86_64-2.7/ python runTest.py
[10]
Will call calculate_dW
Will call PyArray_SimpleNewFromData
Segmentation fault (core dumped)
(即调用PyArray_SimpleNewFromData()时的SegFault(如果我将其替换为 ret = 1 ,则分段错误消失) . 调试时,我尝试了很多东西:
将维数更改为1;
增加 malloc() 分配的内存量(以保证我不会访问任何我不应该访问的内容);
将 np.NPY_FLOAT32 更改为 np.float32 ;
更改我传递新数组的"shape"的方式 .
不过,我确实注意到互联网上的所有其他代码在调用PyArray_SimpleNewFromData时都使用C(而不是Python) . 我尝试从C函数返回 PyObject* ,但无法编译 .
另外,我确实得到了一些"Using deprecated NumPy API, disable it by #defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION"警告;但我读过我可以安全地忽略它们 . (Cython Numpy warning about NPY_NO_DEPRECATED_API when using MemoryView)
有什么建议吗? (还有,从 dW 创建一个numpy数组的任何其他方法?)