使用numpy查找矩阵中所有元素为零的行

发布于 2021-01-29 15:06:45

我的numpy矩阵很大M。矩阵的某些行的所有元素均为零,我需要获取这些行的索引。我正在考虑的天真的方法是遍历矩阵中的每一行,然后检查每个元素。但是,我认为有一种更好,更快的方法可以使用来完成此操作numpy。希望您能提供帮助!

关注者
0
被浏览
90
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这是一种方法。我认为numpy已使用导入import numpy as np

    In [20]: a
    Out[20]: 
    array([[0, 1, 0],
           [1, 0, 1],
           [0, 0, 0],
           [1, 1, 0],
           [0, 0, 0]])
    
    In [21]: np.where(~a.any(axis=1))[0]
    Out[21]: array([2, 4])
    

    这个答案略有不同:如何检查矩阵是否包含零列?

    这是怎么回事:

    any如果数组中的任何值为“
    truthy”,则该方法返回True。非零数字被视为True,而0被视为False。通过使用参数axis=1,该方法将应用于每一行。对于示例a,我们有:

    In [32]: a.any(axis=1)
    Out[32]: array([ True,  True, False,  True, False], dtype=bool)
    

    因此,每个值指示相应的行是否包含非零值。该~操作是二进制“不是”或补充:

    In [33]: ~a.any(axis=1)
    Out[33]: array([False, False,  True, False,  True], dtype=bool)
    

    (给出相同结果的替代表达式是(a == 0).all(axis=1)。)

    要获取行索引,我们使用where函数。它返回参数为True的索引:

    In [34]: np.where(~a.any(axis=1))
    Out[34]: (array([2, 4]),)
    

    请注意,where返回的元组包含单个数组。 where适用于n维数组,因此它总是返回一个元组。我们想要该元组中的单个数组。

    In [35]: np.where(~a.any(axis=1))[0]
    Out[35]: array([2, 4])
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看