<p>这里有一个矢量化方法,只使用<a href="https://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.unique.html" rel="nofollow noreferrer">^{<cd1>}</a>中的唯一值,与原始数组进行比较,从而得到一个热编码数组-</p>
<pre><code>(inputx[:,None] == np.unique(inputx)).astype(float)
</code></pre>
<p><strong>运行时测试</strong></p>
<p>其他方法-</p>
^{pr2}$
<p>时间安排-</p>
<pre><code>In [42]: inputx = np.random.randint(1, 4, 1000000)
In [43]: %timeit ohc(inputx)
1 loops, best of 3: 526 ms per loop
In [44]: %timeit ohc_dict(inputx)
1 loops, best of 3: 256 ms per loop
In [45]: %timeit unique_inverse(inputx)
10 loops, best of 3: 48.6 ms per loop
In [46]: %timeit (inputx[:,None] == np.unique(inputx)).astype(float)
10 loops, best of 3: 34.4 ms per loop
</code></pre>
<p><strong>进一步提高性能-</strong></p>
<p>使用<code>np.int8</code>作为输出数据类型,以便通过建议的方法进一步提高性能-</p>
<pre><code>In [58]: %timeit (inputx[:,None] == np.unique(inputx)).astype(np.int8)
10 loops, best of 3: 27.7 ms per loop
</code></pre>
<p>正如@paulpanzer建议的那样,我们也可以使用<code>view</code>来代替类型转换,以进一步增强数组的唯一性-</p>
<pre><code>In [23]: inputx = np.random.randint(1, 40, 1000000)
In [24]: %timeit (inputx[:,None] == np.unique(inputx)).astype(np.int8)
10 loops, best of 3: 98.4 ms per loop
In [25]: %timeit (inputx[:,None] == np.unique(inputx)).view(np.int8)
10 loops, best of 3: 92.5 ms per loop
</code></pre>