Scipy.spacetial.distance在正常导入时不起作用



我正在尝试计算Python代码中两点之间的欧氏距离。但是,当我通过以下方式导入scipy.space时:from scipy.spatial import distance和调用:distance=distance.euclidean([5,2],[1,1])时,我收到此错误:AttributeError: 'numpy.float64' object has no attribute 'euclidean'。当我像这样导入 scipy 时:from scipy.spatial import distance as dist并调用distance=dist.euclidean([5,2],[1,1])它有效。我不明白通过重命名导入它实际上是如何工作的,当我不重命名它时,它会抛出该错误?

所有工作都按预期工作,但您覆盖了distance并且会出现错误。

from scipy.spatial import distance 

这是正常的导入,distance是一个模块。你可以检查一下

#distance is a module now
type(distance)

输出:

module

在这里你覆盖距离 - 这是不好的风格,容易出错。

distance=distance.euclidean([5,2],[1,1])

从这里开始,distance不再是一个模块,而是被覆盖为一个numpy.float64。此时,您无法再执行distance.euclidean()如果这样做,则会出现显示的错误,即

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-34-70ad947b0b7c> in <module>
1 # .euclidean() is not defined for a numpy.float64
2 # a error is expected
----> 3 distance=distance.euclidean([5,2],[1,1])
AttributeError: 'numpy.float64' object has no attribute 'euclidean'

同样,您可以检查确实distance是一个带有type(distance)的浮点数,它将返回numpy.float64

如果使用其他名称导入,则为:

from scipy.spatial import distance as dist
distance=dist.euclidean([5,2],[1,1])

不会覆盖任何内容。所以一切都很好,我们很好,保持得很好。

或使用

my_distance=distance.euclidean([5,2],[1,1])
  • 不要将模块名称与变量混淆。
  • 通常不要覆盖到不同的类型,以避免混淆/错误。

对我来说,这段代码运行没有问题:

from scipy.spatial import distance
a=distance.euclidean([5,2],[1,1])
print(a)
from scipy.spatial import distance as dist
b=dist.euclidean([5,2],[1,1])
print(b)

输出:

4.123105625617661
4.123105625617661

我的西比是1.4.1版

最新更新