<h3>进近#1</h3>
<p>我们可以再次使用<code>argsort</code>技巧,正如在<a href="https://stackoverflow.com/a/49882983/3293881">^{<cd2>}</a>中讨论的那样,但是有点扭曲。我们将第二个数组连接到第一个数组中,然后执行<code>argsort-ing</code>。我们需要对级联数组和第二个数组使用<code>argsort</code>,并获得所需的输出。这个实现看起来像这样-</p>
<pre><code>ab = np.vstack((a,b))
len_a, len_b = len(a), len(b)
b_argoffset = b.argsort(0).argsort(0)
total_args = ab.argsort(0).argsort(0)[-len_b:]
out = len_a - total_args + b_argoffset
</code></pre>
<p><strong>解释</strong></p>
<ol>
<li>将要计算其值的第二个数组连接到第一个数组中。你知道吗</li>
<li>现在,由于我们正在追加,我们将稍后在第一个数组长度结束后获得它们的索引位置。你知道吗</li>
<li>我们使用一个<code>argsort</code>来获得第二个数组w.r.t到整个级联数组的相对位置,并使用另一个<code>argsort</code>来追溯这些索引w.r.t的原始顺序。你知道吗</li>
<li>我们需要对自身上的第二个数组重复double<code>argsort-ing</code>,以便补偿串联。你知道吗</li>
<li>这些索引针对<code>b</code>中的每个元素,比较:<code>a[:,j] > b[i,j]</code>。现在,这些索引顺序是基于0的,即接近<code>0</code>的索引表示<code>a[:,j]</code>中的元素数大于当前元素<code>b[i,j]</code>,因此计数更大,反之亦然。因此,我们需要从<code>a[:,j]</code>的长度中减去这些索引,得到最终的输出。你知道吗</li>
</ol>
<h3>方法#1-改善</h3>
<p>我们将通过使用<code>array-assignment</code>来进一步优化它,同样是受到来自同一解决方案的<code>Approach #2</code>的启发。因此,这些arg输出:<code>b_argoffset</code>和<code>total_args</code>可以交替计算,就像这样-</p>
<pre><code>def unqargsort(a):
n,m = a.shape
idx = a.argsort(0)
out = np.zeros((n,m),dtype=int)
out[idx, np.arange(m)] = np.arange(n)[:,None]
return out
b_argoffset = unqargsort(b)
total_args = unqargsort(ab)[-len_b:]
</code></pre>
<h3>进近#2</h3>
<p>我们还可以利用<a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.searchsorted.html" rel="nofollow noreferrer">^{<cd18>}</a>实现一种完全不同的方法-</p>
<pre><code>k,m = b.shape
sidx = a.argsort(0)
out = np.empty((k,m), dtype=int)
for i in range(m): #cols
out[:,i] = np.searchsorted(a[:,i], b[:,i],sorter=sidx[:,i])
out = len(a) - out
</code></pre>
<p><strong>解释</strong></p>
<ol>
<li>我们得到<code>a</code>的每一列的排序顺序索引。你知道吗</li>
<li>然后,使用这些索引来获得如何将值从<code>b</code>放入排序后的<code>a</code>中,使用<code>searcshorted</code>。这与{<cd23>}中步骤#3,4的输出相同。你知道吗</li>
</ol>
<p>请注意,这些方法为我们提供了计数。因此,对于最终的输出,将得到的输出除以<code>n</code>。你知道吗</p>