Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 产生不同结果的等效numpy脚本_Python_Numpy - Fatal编程技术网

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

Python 产生不同结果的等效numpy脚本,python,numpy,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) 代码

我运行了以下被认为是相同的脚本,但输出完全不同, 有人能解释为什么吗

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

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)
AOVoltage = (np.linspace(-1, 1, 2200)).ctypes.data_as(POINTER(c_double))
print AOVoltage.contents

c_double(1.821347161578237e-284)
代码3:

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

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

c_double(1.821347161578237e-284)

要使其工作,您需要保留对原始
numpy
数组的引用,以防止其被垃圾收集。这就是为什么#2起作用,而#1和#3不起作用(它们的行为尚未定义)

下文对此进行了解释:

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


要使其工作,您需要保留对原始
numpy
数组的引用,以防止其被垃圾收集。这就是为什么#2起作用,而#1和#3不起作用(它们的行为尚未定义)

下文对此进行了解释:

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


对于你的每一个代码,我都得到了精确的
c\u-double(-1.0)
。这很有趣。我不能从IPython复制它,但我可以从Python提示符复制它,如果数组在Python解释器中被垃圾收集,并且后来用来保存数组的内存有其他东西,那么这似乎是合理的,但是IPython保留了对每个输入行的引用对于您的每一个代码。这很有趣。我不能从IPython复制它,但我可以从Python提示符复制它,如果数组在Python解释器中被垃圾收集,并且后来用来保存数组的内存有其他东西,这似乎是合理的,但是IPython保留了对每个输入行的引用。这听起来是原因,现在我只是想知道它是否会被认为是python引用计数机制的一个bug?还是他们故意这样做?@shelper:事实证明这是有记录的行为。查看更新的答案。好的,这是一个棘手的问题。我不知道这是关于
ctypes
的。我学到了一些东西。Thanksit听起来是原因,现在我只是想知道它是否会被认为是python引用计数机制的一个bug?还是他们故意这样做?@shelper:事实证明这是有记录的行为。查看更新的答案。好的,这是一个棘手的问题。我不知道这是关于
ctypes
的。我学到了一些东西。谢谢