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
的。我学到了一些东西。谢谢