<blockquote>
<p>PS: numpy.allclose() is another way to do it, but I need to use number * np.ones([array.shape[0], array.shape[1]]) and it still seems verbose to me...</p>
</blockquote>
<p>你几乎不需要做任何类似<code>number * np.ones([array.shape[0], array.shape[1]])</code>的操作。正如您可以将该标量<code>number</code>乘以该<code>ones</code>数组以将其所有的<code>1</code>值乘以<code>number</code>,您可以将该标量{<cd2>}传递给<code>allclose</code>,将原始数组的所有值与<code>number</code>进行比较。例如:</p>
<pre><code>>>> a = np.array([[2.000000000001, 2.0000000002], [2.000000000001, 1.999999999]])
>>> np.allclose(a, 2)
True
</code></pre>
<hr/>
<p>作为旁注,如果您真的需要一个包含所有2的数组,有一种比2乘以<code>ones</code>更简单的方法:</p>
^{pr2}$
<p>对于这个问题,我不知道你为什么要做<code>[array.shape[0], array.shape[1]]</code>。如果数组是2D,则与<code>array.shape</code>完全相同。如果数组可能更大,它与<code>array.shape[:2]</code>完全相同。在</p>
<hr/>
<p>我更想知道他们是否真的解决了问题。但事实上,你说你可以使用<code>allclose</code>,如果不是因为它太冗长而无法创建可比较的数组。在</p>
<p>所以,如果你需要<code>whereclose</code>而不是<code>allclose</code>那么,没有这样的函数。但是建立你自己是很容易的,如果你反复做的话,你总是可以结束它。在</p>
<p>如果您有一个<code>isclose</code>方法,比如<code>allclose</code>,但是返回一个bool数组而不是一个bool,那么您可以写:</p>
<pre><code>idx = np.where(isclose(a, b, 0, atol))[0][0]
</code></pre>
<p>……或者,如果你一遍又一遍地做:</p>
<pre><code>def whereclose(a, b, rtol=1e-05, atol=1e-08):
return np.where(isclose(a, b, rtol, atol))
idx = whereclose(a, b, 0, atol)[0][0]
</code></pre>
<p>事实证明,numpy <a href="https://github.com/numpy/numpy/blob/master/numpy/core/numeric.py#L2133" rel="nofollow">does have exactly that function</a>(另请参见<a href="https://github.com/numpy/numpy/pull/224" rel="nofollow">here</a>)的1.7版本,但文档中似乎没有。如果您不想依赖一个可能没有文档的函数,或者不需要使用numpy 1.6,您可以自己编写它:</p>
<pre><code>def isclose(a, b, rtol=1e-05, atol=1e-08):
return np.abs(a-b) <= (atol + rtol * np.abs(b))
</code></pre>