擅长:python、mysql、java
<p>您可以用<code>nan</code>替换不需要的值,但这将更改原始数组:</p>
<pre><code>dod[~numpy.logical_or(numpy.isclose(dod, 0), numpy.isclose(dod, -9.99))] = numpy.nan
numpy.mean(dod)
</code></pre>
<p>需要分配三个额外的布尔数组来执行该操作,但不会创建额外的浮点数组。你知道吗</p>
<p>或者只选择所需的值并取平均值:</p>
<pre><code>tmp = dod[~numpy.logical_or(numpy.isclose(dod, 0), numpy.isclose(dod, -9.99))]
numpy.mean(tmp)
</code></pre>
<p>但这将额外创建一个中间浮点数组</p>
<pre><code>numpy.may_share_memory(tmp, dod) # False
</code></pre>
<p>第三个选项是创建一个屏蔽数组,如:</p>
<pre><code>tmp2 = numpy.ma.masked_where(
numpy.logical_or(numpy.isclose(dod, 0), numpy.isclose(dod, -9.99)),
dod,
copy=False
)
numpy.mean(tmp2)
</code></pre>
<p>它只创建额外的布尔数组,而不创建中间浮点数组:</p>
<pre><code>numpy.may_share_memory(tmp2.data, dod) # True
</code></pre>
<h2>结论</h2>
<ul>
<li>如果允许修改输入数组,请这样做(选项1)</li>
<li>如果不允许修改输入数组,请创建临时屏蔽数组(选项3)</li>
</ul>