使用numpy.tril提取对角线上方的列表元素

时间:2019-01-24 00:03:51

标签: python numpy

嗨,我想用numpy.tril在对角线上方提取嵌套列表的元素。据我了解,设置参数k> 0,它将返回对角线上方。但是,我的代码未返回预期的结果。

np.tril([[1,2,3],[4,5,6],[7,8,9]], 1)
>>> array([[1, 2, 0],
       [4, 5, 6],
       [7, 8, 9]])

预期输出:

array([1,2,3],
[4,5,0],
[7,0,0,])

3 个答案:

答案 0 :(得分:1)

您可以翻转数组,得到上部三角形,然后将其翻转回去:

In [1]: import numpy as np

In [2]: a = np.array([[1,2,3],[4,5,6],[7,8,9]])

In [3]: np.triu(a[:, ::-1])[:, ::-1]
Out[3]:
array([[1, 2, 3],
       [4, 5, 0],
       [7, 0, 0]])

答案 1 :(得分:1)

两个问题。首先, np.tril (如其名称所示)给出一个对角线。其次,三角形阵列通常是所需输出的镜像。

我们可以查看{strong> source codenp.triu,并通过np.fliplr将其改编为新的triu_anti功能:

def triu_anti(m, k=0):
    m = np.asanyarray(m)
    mask = np.fliplr(np.tri(*m.shape[-2:], k=k-1, dtype=bool))
    return np.where(mask, np.zeros(1, m.dtype), m)

res = triu_anti([[1,2,3],[4,5,6],[7,8,9]])

print(res)
# array([[1, 2, 3],
#        [4, 5, 0],
#        [7, 0, 0]])

答案 2 :(得分:0)

两次使用T

np.tril(a.T,0).T
array([[1, 2, 3],
       [0, 5, 6],
       [0, 0, 9]])