等效的numpy脚本产生不同的结果

时间:2012-11-20 15:37:41

标签: python numpy

我运行了以下脚本,这些脚本被认为是相同的,但输出完全不同, 谁能解释为什么?

我首先导入了必要的模块:

from ctypes import *
import numpy as np 

代码1:

AOVoltage = np.linspace(-1, 1, 2200)
AOVoltage = AOVoltage.ctypes.data_as(POINTER(c_double))
print AOVoltage.contents

c_double(1.821347161578237e-284)

代码2:

a = np.linspace(-1, 1, 2200)
AOVoltage = a.ctypes.data_as(POINTER(c_double))
print AOVoltage.contents

c_double(-1.0)

Code3:

AOVoltage = (np.linspace(-1, 1, 2200)).ctypes.data_as(POINTER(c_double))
print AOVoltage.contents

c_double(1.821347161578237e-284)

1 个答案:

答案 0 :(得分:4)

为此,您需要保留对原始numpy数组的引用,以防止它被垃圾回收。这就是为什么#2有效,#1和#3没有(他们的行为未定义)。

documentation

中对此进行了解释
  

小心使用ctypes属性 - 尤其是临时阵列或动态构建的数组。例如,调用(a+b).ctypes.data_as(ctypes.c_void_p)会返回一个指向无效内存的指针,因为创建为(a+b)的数组在下一个Python语句之前被释放。您可以使用c=a+bct=(a+b).ctypes来避免此问题。在后一种情况下,ct将保留对数组的引用,直到ct被删除或重新分配。