我正在使用numpy使用Python 2.7.6进行编程。我在两个numpy矩阵之间划分V/np.dot(W,H)
。有时会发生分母的某些单元格值等于0,因此我得到运行时错误。我想以有效的方式实施安全部门。如何编写执行矩阵除法的代码,以及分母等于0的元素在输出矩阵中放置0?
答案 0 :(得分:2)
Numpy实际上允许您设置在除以零错误的情况下您想要做的事情 - 请参阅seterr。我相信这是一个全球性的旗帜 - 我不知道一个更本地化的解决方案 - 如果这是一个问题,我想你可以在安全分工之前和之后设置seterr。
答案 1 :(得分:1)
只需在分母中搜索零的元素,然后将其替换为infinity。
D = np.dot(W,H)
D[D==0] = float('inf')
result = V / D
这种方法比使用result = V / D
检查零的普通D[D==0] = float('inf')
要慢,但随着矩阵大小的增加,它会变得更好。使用30x30矩阵时,它需要三倍的长度,而使用250x250矩阵则需要两倍的时间,而随着n的增加,它会接近1.8倍的长度。它似乎比根据Daryl's answer和Adrian's answer更改浮点异常的处理速度快10%。
要记住的一点是,对于浮点数和精度不足,分母中的元素应该为零但不完全,并且很容易将其合并如下
epsilon = 1e-8
D[np.abs(D)<epsilon] = float('inf')
答案 2 :(得分:1)
虽然你说“矩阵”,但我认为你真的想要数组,因为你想要元素 师。我只是在一个上下文管理器中进行分区来抑制 div0错误。然后我会修复结果。
# Assume V and D are arrays of the same shape
with np.errstate(divide='ignore'):
# division errors suppressed only within this block
quot = V / D
quot[D == 0] = 0
我的直觉告诉我这很快,因为它主要是保持数据的原始形状。但我从未将其与其他方法进行比较。