擅长:python、mysql、java
<p>使用掩码对每个元素的条件进行编码:</p>
<pre><code>mask = (x != 0)
</code></pre>
<p>可以对满足条件的数据部分应用numpy操作:</p>
<pre><code>output = np.zeros(x.shape, dtype=float)
output[~mask] = 1
output[mask] = tan(x[mask]) / x[mask]
</code></pre>
<p>全部(减少冗余操作):</p>
<pre><code>def tanc(x):
output = np.zeros(x.shape, dtype=float)
output[~mask] = 1
selected = x[mask]
output[mask] = tan(selected) / selected
return output
</code></pre>
<p><strong>后脚本</p>
<p>根据我的选择,<a href="https://stackoverflow.com/a/58228148/2988730">@jirasaimok's excellent answer</a>是一种更优雅的(numpythonic,如果您愿意的话)方法来完成同样的事情:避免每个元素进行一次以上的计算,并避免零除法。我建议可以使用<code>tan</code>和<code>divide</code>的<code>out</code>关键字进一步增强他们的答案,以避免分配和复制不必要的临时数组:</p>
<pre><code>def tanc(x):
mask = (x != 0)
output = np.tan(x, where=mask)
np.divide(output, x, where=mask, out=output)
output[~mask] = 1
return output
</code></pre>
<p>或者更好:</p>
<pre><code>def tanc(x):
mask = (x != 0)
output = np.tan(x, where=mask, out=np.ones(x.shape, float))
return np.divide(output, x, where=mask, out=output)
</code></pre>