在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
答案 0 :(得分:5)
您似乎忽略了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)
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。
使用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
的处理方式,您可能需要在将这些条目归零之前复制一份。)