【问题标题】:how to slice last non-zero row elements from matrix [duplicate]如何从矩阵中切片最后一个非零行元素[重复]
【发布时间】:2019-06-05 09:50:09
【问题描述】:

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

【问题讨论】:

  • 他们会一直以0结尾吗?或者这可能[1,2,0,0,3,0,0]
  • 是的,但这并不重要,因为我知道我想要的每一行元素的索引。
  • 给定b,使用索引-np.take_along_axis(a,b[:,None],axis=1).ravel()
  • 这个最快,谢谢!

标签: python numpy


【解决方案1】:

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

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

[1, 6, 78, 56, 54]

【讨论】:

    【解决方案2】:

    更 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 不是 >0,这将引发 StopIteration 异常

    【讨论】:

      【解决方案3】:

      我发现的另一种可能性:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2019-02-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-02
          • 2014-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多