Python 检查numpy数组中的所有元素是否匹配一个数字

Python 检查numpy数组中的所有元素是否匹配一个数字,python,numpy,Python,Numpy,在我的python测试脚本中,我想断言numpy数组的所有元素是否非常接近1.0或等于0.0。该数组如下所示: [[0.9999999991268851 1.0000000223517418 0.999999986961484 ..., 0.9999999841675162 1.0000000074505806 0.9999999841675162] [0.9999999991268851 1.0000000223517418 0.999999986961484 ..., 0.9999

在我的python测试脚本中,我想断言numpy数组的所有元素是否非常接近1.0或等于0.0。该数组如下所示:

[[0.9999999991268851 1.0000000223517418 0.999999986961484 ...,
  0.9999999841675162 1.0000000074505806 0.9999999841675162]
 [0.9999999991268851 1.0000000223517418 0.999999986961484 ...,
  0.9999999841675162 1.0000000074505806 0.9999999841675162]
 [0.9999999991268851 1.0000000223517418 0.999999986961484 ...,
  0.9999999841675162 1.0000000074505806 0.9999999841675162]
 ..., 
 [1.0000000198488124 1.0000000074505806 1.000000002568413 ...,
  0.9999999888241291 0.9999999925494194 0.0]
 [1.000000011001248 0.9999999850988388 0.9999999869323801 ...,
  1.0000000186264515 0.9999999925494194 0.0]
 [1.000000011001248 0.9999999850988388 0.9999999869323801 ...,
  1.0000000186264515 0.9999999925494194 0.0]]

我曾想过使用numpy.allclose或numpy.array_equal,但在这里两者都没有意义。理想情况下,函数应该能够在测试场景中使用

我能想到的最简单的事情就是迭代数组的每个元素,并测试它是否接近1或等于0:

import numpy as np

arr = np.array([[0.9999999991268851, 1.0000000223517418, 0.999999986961484],
                [1.0000000186264515, 0.9999999925494194, 0.0]])

def is_one_or_zero(arr):
  for elem in np.nditer(arr):
    if not (elem == 0 or np.isclose(1.0, elem)):
      return False
  return True

print is_one_or_zero(arr) # Should be True
arr[0, 0] = 1.01
print is_one_or_zero(arr) # Should be False

您可以获取0元素并使用布尔索引将其屏蔽。完成后,
np.allclose
正是您想要的:

zeros = arr == 0.0
without_zeros = arr[~zeros]
np.allclose(without_zeros, 1, ...)

什么是“非常接近”?我想你看到的是numpy的
assert\u几乎等于
。参见示例。为什么
allclose
没有意义?(它可以广播!)我会迭代
arr.flat
,而不是假设它是一个2D数组。@mgilson我将它改为使用
np.nditer
arr.flat
np.nditer
相比有什么优势吗?我不知道:-)。这两者之间可能没有太大区别——虽然我已经有一段时间没有大量使用numpy了,所以我可能在这里错了…
arr.flat
是一个非常简单的迭代器,总是以c-连续顺序进行迭代
nditer
能够执行更复杂的操作,请参阅。另一方面,由于严重的python性能损失,numpy数组的python循环通常不是一个好主意。