<p>使用<code>with open</code>时,不要自己关闭它。<code>with</code>上下文自动执行此操作。我还更改了通用的<code>array</code>名称,使其隐藏其他内容的风险更小(比如<code>np.array</code>?)在</p>
<pre><code>with open("file.dat", "rb") as f:
data = np.fromfile(f, dtype=np.float32)
</code></pre>
<p>首先不需要在<code>np.array</code>中包装<code>np.zeros</code>。它已经是一个数组。^如果<code>data</code>是1d,则{<cd7>}是可以的,但是我更喜欢使用<code>shape</code>元组。在</p>
^{pr2}$
<p>布尔索引/遮罩允许您同时对整个数组执行操作:</p>
<pre><code>mask = data != -9.99e8 # don't need `float` here
# using != test with floats is poor idea
data[mask] -= 273.15
</code></pre>
<p>我需要改进<code>!=</code>测试。它适用于整数,但不适用于浮点。像<code>np.abs(data+9.99e8)>1</code>这样的东西更好</p>
<p>类似地,<code>in</code>也不是一个好的float测试。对于整数,<code>in</code>和{<cd14>}执行冗余工作。在</p>
<p>假设<code>temps</code>是1d,则<code>np.where(...)</code>返回一个1元素元组。<code>[0]</code>选择该元素,返回一个数组。然后<code>,</code>在^{<cd19>中是冗余的。<code>index, = np.where()</code>没有<code>[0]</code>应该可以工作。在</p>
<p>根据数组初始化的方式,<code>T_SLR[i]</code>已为0。不用再设置了。在</p>
<pre><code>for i in range(0,len(array)):
if array[i] in temps:
index, = np.where(temps==array[i])[0]
T_SLR = slr[index]
else:
T_SLR[i] = 0.00
</code></pre>
<p>但我认为我们也可以摆脱这种迭代。但我会把讨论留到以后再说。在</p>
<hr/>
<pre><code>In [461]: temps=np.arange(-30.00,0.01,0.01, dtype='float32')
In [462]: temps
Out[462]:
array([ -3.00000000e+01, -2.99899998e+01, -2.99799995e+01, ...,
-1.93138123e-02, -9.31358337e-03, 6.86645508e-04], dtype=float32)
In [463]: temps.shape
Out[463]: (3001,)
</code></pre>
<p>难怪做<code>array[i] in temps</code>和{<cd24>}很慢</p>
<p>我们可以把<code>in</code>去掉,看看<code>where</code></p>
<pre><code>In [464]: np.where(temps==12.34)
Out[464]: (array([], dtype=int32),)
In [465]: np.where(temps==temps[3])
Out[465]: (array([3], dtype=int32),)
</code></pre>
<p>如果没有匹配项,<code>where</code>返回一个空数组。在</p>
<pre><code>In [466]: idx,=np.where(temps==temps[3])
In [467]: idx.shape
Out[467]: (1,)
In [468]: idx,=np.where(temps==123.34)
In [469]: idx.shape
Out[469]: (0,)
</code></pre>
<p>如果匹配项在列表的早期,则<code>in</code>可能比<code>where</code>快,但如果不是更慢,则匹配在结束时,或者没有匹配。在</p>
<pre><code>In [478]: timeit np.where(temps==temps[-1])[0].shape[0]>0
10000 loops, best of 3: 35.6 µs per loop
In [479]: timeit temps[-1] in temps
10000 loops, best of 3: 39.9 µs per loop
</code></pre>
<hr/>
<p>四舍五入法:</p>
<pre><code>In [487]: (np.round(temps,2)/.01).astype(int)
Out[487]: array([-3000, -2999, -2998, ..., -2, -1, 0])
</code></pre>
<p>我建议调整一下:</p>
<pre><code>T_SLR = -np.round(data, 2)/.01).astype(int)
</code></pre>