我正在运行到RuntimeWarning:divide中遇到无效值
import numpy
a = numpy.random.rand((1000000, 100))
b = numpy.random.rand((1,100))
dots = numpy.dot(b,a.T)/numpy.dot(b,b)
norms = numpy.linalg.norm(a, axis =1)
angles = dots/norms ### Basically I am calculating angle between 2 vectors
在我的a中有一些向量的范数是0。所以在计算角度时,它会给出运行时警告。
有没有一种计算角度的单线Python方法,同时考虑0的规范?
angles =[i/j if j!=0 else -2 for i,j in zip(dots, norms)] # takes 10.6 seconds
但这需要很多时间。因为所有角度的值都在1到-1之间,我只需要10个最大值,这对我有帮助。这大约需要10.6秒,这太疯狂了。
可以使用
angles[~np.isfinite(angles)] = ...
将nan
值替换为其他值。例如:
注意,除以零可能导致
inf
s,而不是nan
s因此,最好调用
np.isfinite
,而不是np.isnan
来标识被零除的位置。注意,如果只需要NumPy数组的前十个值,那么使用
np.argpartition
函数可能比对整个数组进行完全排序要快,特别是对于大型数组:这表明即使对于中等大小的数组,
np.argpartition
也更快:你想使用
np.where
。请参阅documentation。角度由
downs/norms
组成,否则为-2。您仍然会得到运行时警告,因为np.where
仍将在内部计算整个向量dots/norms
,但您可以安全地忽略它。您可以使用
np.errstate
上下文管理器忽略警告,然后用所需内容替换nans:相关问题 更多 >
编程相关推荐