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



我有一个矩阵,想得到最后一个非负元素。我碰巧已经在数组 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?

循环有效,但不是很python化。

您可以使用列表推导式并枚举内置函数:

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

[1, 6, 78, 56, 54]

更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 ]

但是,如果没有a_element,这将引发StopIteration异常>0

我发现的另一种可能性:

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

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

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