<p>我认为基于<em>熊猫</em>编写解决方案更容易。
原因是:</p>
<ul>
<li>我可以使用列名(代码可读性更好)</li>
<li><em>Pandas</em>API功能更强大,尽管它的工作速度比“pure”<em>Numpy</em>慢</李>
</ul>
<p>进行如下工作:</p>
<ol>
<li><p>将<em>var</em>转换为数据帧:</p>
<pre><code> lines = pd.DataFrame(var.reshape(10,4), columns=pd.MultiIndex.from_product(
(['P1', 'P2'], ['x','y'])))
</code></pre>
<p><em>行</em>的初始部分为:</p>
<pre><code> P1 P2
x y x y
0 551 752 541 730
1 548 738 723 548
2 285 682 226 676
3 416 679 345 678
</code></pre>
</li>
<li><p>计算每条线长度的平方:</p>
<pre><code> lines[('', 'lgth')] = (lines[('P1', 'x')] - lines[('P2', 'x')]) ** 2\
+ (lines[('P1', 'y')] - lines[('P2', 'y')]) ** 2
lines.columns = lines.columns.droplevel()
</code></pre>
<p>我故意在长度为<strong>的正方形处“停止”,因为它是
足够比较长度(计算根不会改变
比较结果)</p>
<p>还要注意的是,需要列上的第一级多索引
只是为了更容易地表达感兴趣的列。此外,他们将
不需要,所以我把它扔了</p>
<p>这次我把<em>行的全部内容放到</em>:</p>
<pre><code> x y x y lgth
0 551 752 541 730 584
1 548 738 723 548 66725
2 285 682 226 676 3517
3 416 679 345 678 5042
4 345 678 388 674 1865
5 249 679 226 676 538
6 270 678 388 674 13940
7 472 650 751 473 109170
8 751 473 716 561 8969
9 731 529 751 473 3536
</code></pre>
</li>
<li><p>下一步是计算<em>点</em>数据帧,其中所有点(开始和结束
每行的末尾)以及(平方)的长度位于相同的列中
对应的行:</p>
<pre><code> points = pd.concat([lines.iloc[:,[0, 1, 4]],
lines.iloc[:,[2, 3, 4]]], keys=['P1', 'P2'])\
.sort_values(['x', 'y', 'lgth']).reset_index(level=1)
</code></pre>
<p>现在,我使用<em>iloc</em>来指定列(第一次用于起始点)
第二个是终点)。
为了更容易阅读这个数据帧,我传递了<em>键</em>,以包含“origin”
然后我对行进行排序</p>
<p>内容是:</p>
<pre><code> level_1 x y lgth
P2 5 226 676 538
P2 2 226 676 3517
P1 5 249 679 538
P1 6 270 678 13940
P1 2 285 682 3517
P1 4 345 678 1865
P2 3 345 678 5042
P2 4 388 674 1865
P2 6 388 674 13940
P1 3 416 679 5042
P1 7 472 650 109170
P2 0 541 730 584
P1 1 548 738 66725
P1 0 551 752 584
P2 8 716 561 8969
P2 1 723 548 66725
P1 9 731 529 3536
P2 9 751 473 3536
P1 8 751 473 8969
P2 7 751 473 109170
</code></pre>
<p>注意,例如,点<em>226676</em>出现两次。第一次发生的时候
直线<em>5</em>和第二直线<em>2</em>(直线<em>var</em>和直线<em>中的指数</em>)</p>
</li>
<li><p>要查找要删除的行的索引,请运行:</p>
<pre><code> toDrop = points[points.duplicated(subset=['x', 'y'])]\
.level_1.reset_index(drop=True);
</code></pre>
<p>为了更容易理解这段代码是如何工作的,请一步一步地运行它
检查每个步骤的结果</p>
<p>结果是:</p>
<pre><code> 0 2
1 3
2 6
3 8
4 7
Name: level_1, dtype: int64
</code></pre>
<p>请注意,上面的左列只是索引(这无关紧要)。
真正的信息在右边的列(值)中</p>
</li>
<li><p>要显示应保留的行,请运行:</p>
<pre><code> result = lines.drop(toDrop)
</code></pre>
<p>获取:</p>
<pre><code> x y x y lgth
0 551 752 541 730 584
1 548 738 723 548 66725
4 345 678 388 674 1865
5 249 679 226 676 538
9 731 529 751 473 3536
</code></pre>
<p>上述结果不包含,例如:</p>
<ul>
<li>直线<em>2</em>,当点<em>226时,676</em>出现在直线<em>5</em>中</li>
<li>线<em>3</em>,当点<em>345时,678</em>出现在线<em>4</em>中</li>
</ul>
<p>只有这些行(<em>2</em>和<em>3</em>)被删除,因为它们是
比第二条提到的两条线都长(参见前面的部分结果)</p>
</li>
</ol>
<p>也许这就足够了,或者如果您需要从
<em>var</em>(原始的<em>Numpy</em>数组),并将结果保存到另一个数组中
变量,运行:</p>
<pre><code>var2 = np.delete(var, toDrop, axis=0)
</code></pre>