如何从矩阵中切片最后一个非零行元素

时间:2019-06-05 09:50:09

标签: python numpy

我有一个矩阵,想得到最后一个非负元素。我碰巧已经在数组b中包含了这些索引

 a= [[3, 4, 1, 0, 0, 0, 0, 0, 0],
    [6, 0, 0, 0, 0, 0, 0, 0, 0],
    [24,5, 6, 7, 7, 78, 0, 0, 0],
    [4, 56, 0, 0, 0, 0, 0, 0, 0],
    [23, 5, 7, 11, 12, 52, 65, 54, 0]]

 b = [2, 0, 5, 1, 7]

是否有一种优雅的方法可以添加最后的非零元素?

 c = [1, 6, 78, 56, 54] from a?

一个循环有效,但不是很pythonic。

4 个答案:

答案 0 :(得分:3)

您可以使用列表推导和enumerate内置函数:

[a[i][j] for i, j in enumerate(b)]

  

[1, 6, 78, 56, 54]

答案 1 :(得分:1)

更多的pythonic可能是:

a= [[3, 4, 1, 0, 0, 0, 0, 0, 0],
    [6, 0, 0, 0, 0, 0, 0, 0, 0],
    [24,5, 6, 7, 7, 78, 0, 0, 0],
    [4, 56, 0, 0, 0, 0, 0, 0, 0],
    [23, 5, 7, 11, 12, 52, 65, 54, 0]]

c = [next(a_element for a_element in  sublist[::-1] if a_element>0) for sublist in a ]

但是,如果没有StopIterationa_element,则会引发>0异常

答案 2 :(得分:1)

类似于@vurmux的(更好)答案,您也可以zip

res = [sub[i] for i, sub in zip(b, a)]
print(res)  # -> [1, 6, 78, 56, 54]

答案 3 :(得分:1)

我发现的另一种可能性:

a[range(len(b)), b]