【问题标题】:Elegant way to check empty result of numpy.nonzero检查 numpy.nonzero 的空结果的优雅方法
【发布时间】:2015-07-14 14:14:55
【问题描述】:

使用 numpy 函数numpy.nonzero,是否有一种优雅的方法来检查作为输出的元组是否为空数组?

在 MATLAB 中,这很容易

answer = find( matrix_a < matrix_b );
isempty(answer)

【问题讨论】:

    标签: python matlab numpy code-translation


    【解决方案1】:

    numpythonic 的方法是直接在 ndarray 对象上使用 any/all 方法。

    在您的示例中,您的代码询问:没有索引,其中 matrix_a 小于 matrix_b?

    not (matrix_a < matrix_b).any()
    

    等价地,matrix_a 的所有元素是否都大于 matrix_b 中的对应元素?

    (matrix_a >= matrix_b).all()
    

    【讨论】:

    • 我认为你很困惑 - __builtin__.any(np.array([0])) 是假的,np.any(np.array([0])) 也是如此。应该是真的。要查看奇怪的边缘情况,请考虑使用 a = zeros((3,4)); b = zeros((3,4)); b[0,0] = 1
    • 对不起,我确实把自己弄糊涂了。我预计np.any 是假的,我认为这是你想要的,而__builtin__.any 是真的,我认为这是错误的。但无论如何,两者都是错误的。
    【解决方案2】:

    对于a (10,10) 范围(100)

    In [201]: np.nonzero(a>100)
    Out[201]: (array([], dtype=int32), array([], dtype=int32))
    

    nonzero 返回一个元组,每个维度都有一个数组。该元组可用于索引条件为真的所有元素。

    因此,您可以通过查看其中一个数组的长度来测试“空”nonzero

    len(np.nonzero(a>98)[0])==0
    

    布尔掩码上的any 看起来更简单,但在快速测试中,它实际上更慢。

    np.any(a>98)
    

    MATLAB“查找”返回匹配的项目。 numpy 的等价物是a[np.nonzero(a&gt;100)],或者直接使用布尔掩码a[a&gt;100]

    所以我的快速isempty(find...)) 长相相似的新提名是len(a[...])==0

    【讨论】:

    • 检查元组的第一个数组的长度是我的解决方案,但在我看来它并不优雅。这就是为什么我的问题。也感谢您测试效率。
    • 在 MATLAB 中 isempty(find())any() 更优雅?
    • 当然any() 非常优雅,我的意思是len(np.nonzero(a&gt;98)[0]),...检查元组的第一个数组的长度,这就是我找到的解决方案。我很高兴这样更有效率,因为我的应用程序有很多缓慢的问题。所以我会保留它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多