【发布时间】:2015-07-14 14:14:55
【问题描述】:
使用 numpy 函数numpy.nonzero,是否有一种优雅的方法来检查作为输出的元组是否为空数组?
在 MATLAB 中,这很容易
即
answer = find( matrix_a < matrix_b );
isempty(answer)
【问题讨论】:
标签: python matlab numpy code-translation
使用 numpy 函数numpy.nonzero,是否有一种优雅的方法来检查作为输出的元组是否为空数组?
在 MATLAB 中,这很容易
即
answer = find( matrix_a < matrix_b );
isempty(answer)
【问题讨论】:
标签: python matlab numpy code-translation
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 是真的,我认为这是错误的。但无论如何,两者都是错误的。
对于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>100)],或者直接使用布尔掩码a[a>100]。
所以我的快速isempty(find...)) 长相相似的新提名是len(a[...])==0。
【讨论】:
isempty(find()) 比 any() 更优雅?
any() 非常优雅,我的意思是len(np.nonzero(a>98)[0]),...检查元组的第一个数组的长度,这就是我找到的解决方案。我很高兴这样更有效率,因为我的应用程序有很多缓慢的问题。所以我会保留它。