<p>尝试这两种方法,一种是就地分配给NumPy视图,另一种是创建一个新数组以分配给另一个变量-</p>
<pre><code>#Method 1 (Inplace assignment)
Numbers[(Numbers<=0).cumsum(dtype=bool)] = 0
</code></pre>
<p><em>或,</em></p>
<pre><code>#Method 2 (Not inplace)
np.where(~(Numbers<=0).cumsum(dtype=bool), Numbers, 0)
</code></pre>
<p><em>或,</em></p>
<pre><code>#As an excellent suggestion by Mad Physicist!
Numbers[np.logical_or.accumulate(Numbers >= 0)] = 0
</code></pre>
<p><strong>解释-</strong></p>
<ol>
<li><p>返回<code>[F, F, F, T, F, F, F]</code>的bool数组可以看作是1和0的数组。执行求和运算最终将第一个T分配给后续元素</p>
</li>
<li><p>因此,这会将数组转换为<code>[F, F, F, T, T, T, T]</code>,现在可以仅与<code>boolean indexing</code>一起使用,并将视图设置为0或<code>np.where</code>以获取原始元素,或基于使用<code>~</code>反转布尔值将其设置为0</p>
</li>
<li><p>这里的优点是,如果数组只是由False组成,这意味着没有元素满足条件,那么它只返回原始的<code>Numbers</code>本身,而不是将它们设置为0</p>
</li>
</ol>
<hr/>
<p><strong>运行测试-</strong></p>
<ol>
<li>具有满足条件的值</li>
</ol>
<pre><code>Numbers = np.array([123.6 , 123.6 , -123.6, 110.3748 , 111.6992976, 102.3165566, 97.81462811])
Numbers[(Numbers<=0).cumsum(dtype=bool)] = 0
#array([123.6, 123.6, 0. , 0. , 0. , 0. , 0. ])
</code></pre>
<ol start=“2”>
<li>没有满足条件的值</li>
</ol>
<pre><code>Numbers = np.array([123.6 , 123.6 , 123.6, 110.3748 , 111.6992976, 102.3165566, 97.81462811])
Numbers[(Numbers<=0).cumsum(dtype=bool)] = 0
#array([123.6 , 123.6 , 123.6 , 110.3748 ,111.6992976 , 102.3165566 , 97.81462811])
</code></pre>
<hr/>
<p><strong>编辑:</strong>根据请求新建场景</p>
<pre><code>Numbers1 = np.array([1.1, 2.2, 3.3, 4.4, 5.5])
Numbers2 = np.array([1,2,-3,4,5])
Numbers2 = np.where(~(Numbers2<=0).cumsum().astype(bool), Numbers1, 0)
Numbers2
</code></pre>
<pre><code>array([1.1, 2.2, 0. , 0. , 0. ])
</code></pre>