Python PyArray_SimpleNewFromData中的奇怪分段错误

Python PyArray_SimpleNewFromData中的奇怪分段错误,python,c++,numpy,cython,Python,C++,Numpy,Cython,我的问题“在精神上”类似于 我有一个类似这样的C代码:(原始代码实际上测试malloc()是否返回NULL) 我用它来测试 # 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) 并获得以下输出 $ PYT

我的问题“在精神上”类似于

我有一个类似这样的C代码:(原始代码实际上测试
malloc()
是否返回NULL)

我用它来测试

  # 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
  • 更改传递新阵列“形状”的方式
我相信我也完全遵循了。我似乎没有收到任何编译器错误或警告

尽管如此,我还是注意到互联网上所有其他代码在调用PyArray_SimpleNewFromData时都使用C(而不是Python)。我尝试从C函数返回一个
PyObject*
,但无法编译它

此外,我确实收到了一些“使用不推荐的NumPy API,通过定义NPY\u NO\u不推荐的NPY\u API NPY\u 1\u 7\u API\u版本来禁用它”的警告;但我已经读过,我可以安全地忽略它们。()


有什么建议吗?(还有,用
dW
创建numpy数组的其他方法吗?)

我认为问题在于,当PyArray\u SimpleNewFromData需要指向整数的指针时,您将Python列表作为第二个参数传递给它。我有点惊讶这会编译出来

尝试:

注意,我还将类型更改为
NPY\u FLOAT64
,因为它应该匹配
double

我还将
dim\u w
的定义更改为

np.ndarray[np.NPY_INTP, ndim=1, mode="c"] dim_w
确保数组的类型与numpy期望的匹配。这可能还需要将
calculate\u dW
的签名更改为
double*calculate\u dW(intptr\u t*dim\u w)
以匹配


编辑:第二个问题是您需要包括该行

np.import_array()
在Cython文件中(仅在导入后的顶层)。这会为numpy做一些设置工作。原则上,我认为文档建议您在执行
cimport numpy
时始终包含它。实际上,这只是有时才重要,而这正是其中之一



(答案现在已测试)

我认为问题在于,当PyArray\u SimpleNewFromData需要指向整数的指针时,您正在将Python列表作为第二个参数传递给它。我有点惊讶这会编译

尝试:

注意,我还将类型更改为
NPY\u FLOAT64
,因为它应该匹配
double

我还将
dim\u w
的定义更改为

np.ndarray[np.NPY_INTP, ndim=1, mode="c"] dim_w
确保数组的类型与numpy期望的匹配。这可能还需要将
calculate\u dW
的签名更改为
double*calculate\u dW(intptr\u t*dim\u w)
以匹配


编辑:第二个问题是您需要包括该行

np.import_array()
在Cython文件中(仅在导入后的顶层)。这会为numpy做一些设置工作。原则上,我认为文档建议您在执行
cimport numpy
时始终包含它。实际上,这只是有时才重要,而这正是其中之一



(答案现在已测试)

我放了一些“完全可测试”的代码。即使有你的建议,分段错误仍然存在。我仍然无法解决这个问题=/Ohh…哇…我永远不会发现。非常感谢=)我放了一些“完全可测试”的代码。即使有你的建议,分割错误仍然存在。我仍然被这个问题困扰着。。。哇!我永远也不会发现这一点。非常感谢
np.import_array()