<h2>A<em>Numpy</em>解决方案</h2>
<p>与我的第一个答案相同的结果可以通过单独
在<em>Numpy</em>上</p>
<p>首先定义两个函数中的一个:</p>
<ol>
<li><p>计算直线长度的平方:</p>
<pre><code> def sqLgth(line):
p1, p2 = line
return (p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2
</code></pre>
</li>
<li><p>将向量(<em>1D</em>数组)转换为列数组(a<em>2D</em>数组)
使用单个列:</p>
<pre><code> def toColumn(tbl):
return tbl.reshape(-1, 1)
</code></pre>
</li>
</ol>
<p>两者都将在以后使用</p>
<p>然后进行如下操作:</p>
<ol>
<li><p>获取行数:</p>
<pre><code> lineNo = var.shape[0]
</code></pre>
</li>
<li><p>生成线索引(在<em>点</em>数组中<em>lineInd</em>列的内容
(稍后将创建)):</p>
<pre><code> id = np.repeat(np.arange(lineNo), 2)
</code></pre>
</li>
<li><p>生成“原始指标”(1-开始,2-结束),以便于分析
对于任何中间打印输出:</p>
<pre><code> origin = np.tile(np.array([1, 2]), lineNo)
</code></pre>
</li>
<li><p>计算线长度(点</em>中<em>lgth</em>列的内容):</p>
<pre><code> lgth = np.repeat([ sqLgth(line) for line in var ], 2)
</code></pre>
</li>
<li><p>创建包含一些附加数据(连续数据)的点列表
列包含<em>origin</em>、<em>lineInd</em>、<em>x</em>、<em>y</em>和<em>lgth</em>):</p>
<pre><code> points = np.hstack([toColumn(origin), toColumn(id),
var.reshape(-1, 2), toColumn(lgth)])
</code></pre>
</li>
<li><p>计算要排序的“标准数组”:</p>
<pre><code> r = np.core.records.fromarrays(points[:, 2:].transpose(),
names='x, y, lgth')
</code></pre>
</li>
<li><p>排序<em>点</em>(按<em>x</em>、<em>y</em>和<em>lgth</em>):</p>
<pre><code> points = points[r.argsort()]
</code></pre>
</li>
<li><p>计算点的“反向唯一索引”:</p>
<pre><code> _, inv = np.unique(points[:,2:4], axis=0, return_inverse=True)
</code></pre>
</li>
<li><p>将<em>inv</em>移动1个位置:</p>
<pre><code> rInv = np.roll(inv,1)
</code></pre>
<p>将在下一步中使用,以获取上一个元素</p>
</li>
<li><p>生成要删除的行索引列表:</p>
<pre><code>toDrop = points[[ i for i in range(2 * lineNo)
if inv[i] == rInv[i] ], 1]
</code></pre>
<p>行索引(在<em>点</em>数组中)是重复点(元素)的索引
在<em>inv</em>中等于上一个元素)</p>
<p>列索引(<em>1</em>)-指定<em>lineInd</em>列</p>
<p>整个结果(<em>toDrop</em>)是“拥有”行的索引列表
(包含重复的点)</p>
</li>
<li><p>生成结果:<em>var</em>从
上一步:</p>
<pre><code>var2 = np.delete(var, toDrop, axis=0)
</code></pre>
</li>
</ol>
<p>要打印减少的行列表,可以运行:</p>
<pre><code>for line in var2:
print(f'{line[0]}, {line[1]}')
</code></pre>
<p>结果是:</p>
<pre><code>[551 752], [541 730]
[548 738], [723 548]
[345 678], [388 674]
[249 679], [226 676]
[731 529], [751 473]
</code></pre>
<p>要完全理解此代码的工作原理,请执行以下操作:</p>
<ul>
<li>分别执行每个步骤</li>
<li>打印结果</li>
<li>将其与前面步骤中的打印输出进行比较</li>
</ul>
<p>有时,即使是一些表达式,单独打印也是有意义的
(部分说明),例如<code>var.reshape(-1, 2)</code>-转换
<em>var</em>(形状为<em>(10,2,2)</em>)转换为<em>2D</em>点阵列(每行为
一点)</p>
<p>当然,整个结果与我第一个回答中的结果一样,
但正如你所写,你在熊猫方面几乎没有经验,现在你可以了
比较两种方法并查看<em>熊猫</em>允许执行的情况
更简单、更直观的东西</p>
<p>例如,按某些列排序或查找重复的行。
在<em>熊猫</em>中,这是一个单一指令的问题,具有适当的
参数,而在<em>Numpy</em>中,您必须使用更多指令
并知道各种细节和技巧如何做到同样</p>