2012-11-20 2 views
2

Я запускал следующие сценарии, которые считаются одинаковыми, но вывод совершенно другой, может кто-нибудь объяснить почему?Эквивалентные сценарии numpy, дающие разные результаты

я впервые завезены необходимые модули:

from ctypes import * 
import numpy as np 

code1:

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

Я получаю именно 'c_double (-1.0)' для каждого вашего кода. –

+1

Это интересно. Я не могу воспроизвести его из IPython, но я могу из приглашения Python, который кажется разумным, если массив получает мусор, собранный в интерпретаторе Python, и память, используемая для хранения массива, имеет что-то еще, но IPython сохраняет ссылку на каждая линия ввода. – jorgeca

ответ

4

Для этой работы, необходимо сохранить ссылку на оригинальный numpy массив, чтобы предотвратить его от мусора. Вот почему # 2 работает, а # 1 и # 3 - нет (их поведение не определено).

Это объясняется в documentation:

Будьте осторожны, используя атрибут ctypes - особенно на временных массивов или массивов, построенных на лету. Например, вызов (a+b).ctypes.data_as(ctypes.c_void_p) возвращает указатель на память, который является недопустимым, поскольку массив, созданный как (a+b), освобождается до следующего оператора Python. Вы можете избежать этой проблемы, используя либо c=a+b, либо ct=(a+b).ctypes. В последнем случае ct будет содержать ссылку на массив до тех пор, пока ct не будет удален или повторно назначен.

+0

это звучит как причина, теперь я просто задаюсь вопросом, будет ли это рассматриваться как ошибка ссылочного механизма счета python? или они намеренно заставляют его работать таким образом? – shelper

+0

@shelper: Оказывается, это документированное поведение. См. Обновленный ответ. – NPE

+0

ОК, это было сложно. Я не знал этого о 'ctypes'. узнал что-то. благодаря –

Смежные вопросы