当分母中的元素可以为零时,有效的逐元素矩阵划分

时间:2014-04-13 10:10:54

标签: python performance numpy matrix division

我正在使用numpy使用Python 2.7.6进行编程。我在两个numpy矩阵之间划分V/np.dot(W,H)。有时会发生分母的某些单元格值等于0,因此我得到运行时错误。我想以有效的方式实施安全部门。如何编写执行矩阵除法的代码,以及分母等于0的元素在输出矩阵中放置0?

3 个答案:

答案 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 answerAdrian'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

我的直觉告诉我这很快,因为它主要是保持数据的原始形状。但我从未将其与其他方法进行比较。