<p>试试这个:</p>
<pre><code>import numpy as np
A = np.asarray([400.5, 100, 700, 200, 15, 900])
B = np.asarray([500.5, 200, 500, 600.5, 8, 999])
X = np.asarray([400.5, 700, 100, 300, 15, 555, 900])
Y = np.asarray([500.5, 500,600.5, 100, 8, 555, 999])
AB = np.stack([A, B], axis=-1)
XY = np.stack([X, Y], axis=-1)
eq = AB[:, np.newaxis, :] == XY[np.newaxis, :, :]
eq = np.logical_and.reduce(eq, axis=-1)
indAB, = np.where(np.logical_or.reduce(eq, axis=1))
indXY, = np.where(np.logical_or.reduce(eq, axis=0))
print("indAB", indAB)
print("indXY", indXY)
</code></pre>
<p>输出:</p>
^{pr2}$
<p><strong>说明</strong></p>
<p><code>AB</code>和{<cd2>}只是数组<code>A</code>和{<cd4>}和{<cd5>}和{<cd6>}分别“堆叠”成二维数组。<code>eq</code>保存<code>AB</code>和<code>XY</code>中元素的all-overall比较;<code>np.newaxis</code>用于向<code>AB</code>和{<cd2>}添加维度(注意,<code>AB</code>在位置1获得一个新维度,在位置0中{<cd2>}获得一个新维度)。相等运算符<code>==</code>通过数组的新维度广播数组。第一个<code>np.logical_and.reduce</code>是确保<em>这两个</em>的“组件”是相等的(<code>A</code>到{<cd5>}和{<cd4>}到{<cd6>}),并且<code>np.logical_or.reduce</code>操作检查从<code>AB</code>到{<cd2>}和从<code>XY</code>到{<cd1>}之间是否存在完全相等。最后,<code>np.where</code>得到索引。在</p>
<p>作为缺点,请注意,这需要一个大小为<code>len(A)</code>x<code>len(X)</code>x2的布尔数组,因此,如果原始数组<em>非常</em>则可能会遇到内存问题。在</p>
<p><strong>更新</strong></p>
<p>如前所述,非常大的阵列可能是一个问题。如果您想“一次性”进行所有的比较,实际上并没有办法绕过它(中间数组的大小就是比较的次数)。但是,您也可以“按块”运行算法,例如:</p>
<pre><code>import numpy as np
MAX_SIZE = 2 # Biggest array will be MAX_SIZE x MAX_SIZE x 2
A = np.asarray([400.5, 100, 700, 200, 15, 900])
B = np.asarray([500.5, 200, 500, 600.5, 8, 999])
X = np.asarray([400.5, 700, 100, 300, 15, 555, 900])
Y = np.asarray([500.5, 500,600.5, 100, 8, 555, 999])
AB = np.stack([A, B], axis=-1)
XY = np.stack([X, Y], axis=-1)
maskAB = np.full(len(AB), False, dtype=bool)
maskXY = np.full(len(XY), False, dtype=bool)
for iAB in range(0, len(AB), MAX_SIZE):
pAB = np.expand_dims(AB[iAB:iAB + MAX_SIZE], axis=1)
for iXY in range(0, len(XY), MAX_SIZE):
pXY = np.expand_dims(XY[iXY:iXY + MAX_SIZE], axis=0)
eq = pAB == pXY
eq = np.logical_and.reduce(eq, axis=-1)
maskAB[iAB:iAB + MAX_SIZE] |= np.logical_or.reduce(eq, axis=1)
maskXY[iXY:iXY + MAX_SIZE] |= np.logical_or.reduce(eq, axis=0)
indAB, = np.where(maskAB)
indXY, = np.where(maskXY)
print("indAB", indAB)
print("indXY", indXY)
</code></pre>
<p>输出仍然是:</p>
^{pr2}$
<p>我使用2的<code>MAX_SIZE</code>只是为了说明它在示例中可以工作,但是在实践中,您可以根据您愿意使用的最大内存量来选择它(例如,对于<code>MAX_SIZE = 10000</code>,它应该是几百兆字节的顺序)。<code>MAX_SIZE</code>不需要小于数组的大小,也不必是数组大小的除数。在</p>