当调用具有无限值的矩阵时,Numpy triu会生成nan

时间:2014-07-10 14:15:45

标签: python numpy

在triu函数的Numpy 1.8.1中发现了一些意想不到的行为。

import numpy as np
a = np.zeros((4, 4))
a[1:, 2] = np.inf
a
>>>array([[  0.,   0.,   0.,   0.],
          [ inf,   0.,   0.,   0.],
          [ inf,   0.,   0.,   0.],
          [ inf,   0.,   0.,   0.]])

np.triu(a)
>>>array([[  0.,   0.,   0.,   0.],
          [ nan,   0.,   0.,   0.],
          [ nan,   0.,   0.,   0.],
          [ nan,   0.,   0.,   0.]])

这种行为是否可取?或者我应该提交错误报告?

修改

我在Numpy github页面上提出了issue

1 个答案:

答案 0 :(得分:5)

1。说明

您似乎忽略了RuntimeWarning

>>> np.triu(a)
twodim_base.py:450: RuntimeWarning: invalid value encountered in multiply
  out = multiply((1 - tri(m.shape[0], m.shape[1], k - 1, dtype=m.dtype)), m)

source code for numpy.triu如下:

def triu(m, k=0):
    m = asanyarray(m)
    out = multiply((1 - tri(m.shape[0], m.shape[1], k - 1, dtype=m.dtype)), m)
    return out

这使用numpy.tri来获得一个数组,其中包含对角线以下的数字和上面的零,并从1中减去这个数组,得到一个在对角线以下的零点和上面的数组:

>>> 1 - np.tri(4, 4, -1)
array([[ 1.,  1.,  1.,  1.],
       [ 0.,  1.,  1.,  1.],
       [ 0.,  0.,  1.,  1.],
       [ 0.,  0.,  0.,  1.]])

然后它将此元素与原始数组相乘。因此,原始数组的inf位置,结果为inf * 0,即NaN。

2。解决方法

使用numpy.tril_indices生成下三角形的索引,并将所有条目设置为零:

>>> a = np.ones((4, 4))
>>> a[1:, 0] = np.inf
>>> a
array([[  1.,   1.,   1.,   1.],
       [ inf,   1.,   1.,   1.],
       [ inf,   1.,   1.,   1.],
       [ inf,   1.,   1.,   1.]])
>>> a[np.tril_indices(4, -1)] = 0
>>> a
array([[ 1.,  1.,  1.,  1.],
       [ 0.,  1.,  1.,  1.],
       [ 0.,  0.,  1.,  1.],
       [ 0.,  0.,  0.,  1.]])

(根据您对a的处理方式,您可能需要在将这些条目归零之前复制一份。)