Ben*_*Ben 15 python opencv numpy
谁能解释为什么导入cv和numpy会改变python的struct.unpack的行为?这是我观察到的:
Python 2.7.3 (default, Aug 1 2012, 05:14:39)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from struct import pack, unpack
>>> unpack("f",pack("I",31))[0]
4.344025239406933e-44
Run Code Online (Sandbox Code Playgroud)
这是对的
>>> import cv
libdc1394 error: Failed to initialize libdc1394
>>> unpack("f",pack("I",31))[0]
4.344025239406933e-44
Run Code Online (Sandbox Code Playgroud)
导入cv后仍然可以
>>> import numpy
>>> unpack("f",pack("I",31))[0]
4.344025239406933e-44
Run Code Online (Sandbox Code Playgroud)
导入cv然后numpy后确定
现在我重新启动python:
Python 2.7.3 (default, Aug 1 2012, 05:14:39)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from struct import pack, unpack
>>> unpack("f",pack("I",31))[0]
4.344025239406933e-44
>>> import numpy
>>> unpack("f",pack("I",31))[0]
4.344025239406933e-44
Run Code Online (Sandbox Code Playgroud)
到目前为止这么好,但现在我导入cv AFTER导入numpy:
>>> import cv
libdc1394 error: Failed to initialize libdc1394
>>> unpack("f",pack("I",31))[0]
0.0
Run Code Online (Sandbox Code Playgroud)
我已多次重复这一过程,包括在多台服务器上,它总是以同样的方式.我也尝试过使用struct.unpack和struct.pack,这也没什么区别.
我无法理解如何导入numpy和cv对struct.unpack的输出有任何影响(包仍然是相同的,顺便说一句).
我认为,"libdc1394"是一个红鲱鱼:ctypes错误:libdc1394错误:无法初始化libdc1394
有任何想法吗?
tl; dr:导入numpy然后opencv更改struct.unpack的行为.
更新:Paulo的回答显示这是可重复的.Seborg的评论表明,它与python处理次正规的方式有关,听起来似乎有道理.我查看了上下文,但这似乎不是问题,因为进口后的情境与之前的情况相同.
这不是一个答案,但它对评论来说太大了.我玩了一些值来找到限制.
没有加载numpy和cv:
>>> unpack("f", pack("i", 8388608))
(1.1754943508222875e-38,)
>>> unpack("f", pack("i", 8388607))
(1.1754942106924411e-38,)
Run Code Online (Sandbox Code Playgroud)
加载后numpy和cv,第一行是相同的,但第二个:
>>> unpack("f", pack("i", 8388607))
(0.0,)
Run Code Online (Sandbox Code Playgroud)
您会注意到第一个结果是32位浮点数的下限.然后我尝试了相同的d.
无需加载库:
>>> unpack("d", pack("xi", 1048576))
(2.2250738585072014e-308,)
>>> unpack("d", pack("xi", 1048575))
(2.2250717365114104e-308,)
Run Code Online (Sandbox Code Playgroud)
加载库后:
>>> unpack("d",pack("xi", 1048575))
(0.0,)
Run Code Online (Sandbox Code Playgroud)
现在第一个结果是64位浮点精度的下限.
看起来由于某种原因,按顺序加载numpy和cv库约束unpack使用32位和64位精度,并返回0表示较低值.