<p>这里有一个基于<a href="https://docs.scipy.org/doc/numpy/user/basics.indexing.html#boolean-or-mask-index-arrays" rel="nofollow noreferrer">^{<cd1>}</a>的方法,用于广播减法后的提取和掩码的创建,我们再次使用<code>broadcasting</code>(可以这样说,双<code>broadcasting</code>提供了动力)-</p>
<pre><code>r = np.arange(a.size)
out = (a[:, None] - a)[r[:,None] < r]
</code></pre>
<p><strong>运行时测试</strong></p>
<p>矢量化方法-</p>
^{pr2}$
<p>时间安排-</p>
<pre><code>In [109]: a = np.arange(2000)
In [110]: %timeit pairwise_diff_triu_indices_based(a)
10 loops, best of 3: 36.1 ms per loop
In [111]: %timeit pairwise_diff_masking_based(a)
100 loops, best of 3: 11.8 ms per loop
</code></pre>
<p><strong>进一步了解相关性能参数</strong></p>
<p>让我们深入研究一下这个设置的时间安排,来研究基于掩码的方法有多大帮助。现在,比较有两个部分-掩码创建与索引创建和基于掩码的布尔索引与基于整数的索引。在</p>
<p><strong>创建遮罩有多大帮助?</strong></p>
<pre><code>In [37]: r = np.arange(a.size)
In [38]: %timeit np.arange(a.size)
1000000 loops, best of 3: 1.88 µs per loop
In [39]: %timeit r[:,None] < r
100 loops, best of 3: 3 ms per loop
In [40]: %timeit np.triu_indices(len(a), k=1)
100 loops, best of 3: 14.7 ms per loop
</code></pre>
<p>关于<code>5x</code>相对于索引设置的掩码创建的改进。在</p>
<p><strong>布尔索引对基于整数的索引有多大帮助?</strong></p>
<pre><code>In [41]: mask = r[:,None] < r
In [42]: idx = np.triu_indices(len(a), k=1)
In [43]: subs = a[:, None] - a
In [44]: %timeit subs[mask]
100 loops, best of 3: 4.15 ms per loop
In [45]: %timeit subs[idx]
100 loops, best of 3: 10.9 ms per loop
</code></pre>
<p>关于<code>2.5x</code>的改进。在</p>