【发布时间】:2015-07-29 21:53:56
【问题描述】:
我从 scipy/numpy 得到一些奇怪的行为,我怀疑这是一个错误,但有人可能更了解?我有一对长数组,为了调试目的,我将它们分成长度为 2-4 的帧。我想标准化每对帧并取点积。执行此操作的代码(带有一些调试输出)是:
tf = numpy.copy(t_frame) / norm(t_frame)
pf = numpy.copy(p_frame) / norm(p_frame)
print "OPF:"
print p_frame
print "PF: "
print pf
print "TF norm is: " + str(norm(tf))
print "PF norm is: " + str(norm(pf))
print numpy.dot(tf, pf)
return numpy.dot(tf, pf)
这符合我一段时间的预期(特别是 tf 和 pf 的标准为 1),但随后我开始看到这样的行:
OPF:
[-91 -119 -137 -132]
PF:
[楠楠楠楠]
什么?这可以在新的 Python 窗口中正常化:
>>> p = [ -91, -119, -137, -132]
>>> p / norm(p)
array([-0.37580532, -0.49143773, -0.56577285, -0.54512421])
为了它的价值,我尝试了numpy.linalg.norm、scipy.linalg.norm,并定义了一个函数来返回点积的平方根。
有什么想法吗?
更新: 感谢您的建议!我尝试将 dtype 切换为 float128,但遗憾的是得到了类似的行为。我实际上倾向于认为这是 Python 中的一个错误,而不是此时的 numpy:
- 如果这是一个直截了当的溢出问题,似乎我会得到与给定列表一致的问题。但是,如果我在新的 python 会话中执行它,规范计算得很好。
-
我尝试自己滚动:
def norm(v): return ( sum(numpy.array(v)*numpy.array(v)))**(0.5)这仅使用 numpy 来表示数组。我仍然遇到同样的问题,但 later 在数据集中(并且没有运行时警告)。它正在执行大约 37000 次这样的计算。
- 我实际上是在两个帧上计算标准,一个 t_frame 和一个 p_frame。当且仅当另一个计算发生时,一个的计算才会阻塞。
综上所述,我认为 Python (2.7.9) 内部某处存在一些奇怪的缓冲区溢出???我最终也需要这些计算快速;所以我正在考虑切换到 Cython 进行计算。
更新 2: 我真的尝试过自己动手:
def norm(v):
sum = float(0)
for i in range(len(v)):
sum += v[i]**2
return sum**(0.5)
问题就消失了。所以我猜它是 numpy 中的一个错误(Gentoo Linux 上的 1.9.0)。
【问题讨论】: