<h2>如果你的结果符合记忆的话</h2>
<p>在不依赖三倍于结果大小的中间值的情况下,下面的结果将生成您的预期结果。它使用广播。在</p>
<p>请注意,几乎任何NumPy操作都可以这样广播,因此在实践中可能不需要显式的笛卡尔积:</p>
<pre><code>#shared dimensions:
sh = a.shape[1:]
aba = (a[:, None, None] + b[None, :, None] - a[None, None, :]).reshape(-1, *sh)
aba
#array([[ 0. , 0.03],
# [-1. , 0.16],
# [ 1. , -0.1 ],
# [ 0. , 0.03]])
</code></pre>
<h2>按“ID”寻址结果行</h2>
<p>您可以考虑省略<code>reshape</code>。这将允许您通过组合索引对结果中的行进行寻址。如果你的组件ID只有0,1,2,。。。与您的示例一样,这将与组合ID相同。例如aba[1,0,0]将对应于a的第二行+b的第一行-a的第一行</p>
<h2>一点解释</h2>
<p>广播:例如,当添加两个数组时,它们的形状不必完全相同,只是由于广播的关系而兼容。广播在某种意义上是向数组添加标量的一种概括:</p>
^{pr2}$
<p>广播:</p>
<pre><code> [[4], [[1, 2, 3], [[4, 4, 4],
[[1, 2, 3]] + [5], equiv to [1, 2, 3], + [5, 5, 5],
[6]] [1, 2, 3]] [6, 6, 6]]
</code></pre>
<p>为此,每个操作数的每个维度必须为1或等于其他操作数中的相应维度,除非它是1。如果一个操作数的维数比其他操作数少,它的形状将用左边的维数填充。请注意,图中显示的equiv数组不是显式创建的。在</p>
<h2>如果结果也不符合</h2>
<p>在这种情况下,我不知道如何才能避免使用存储,所以<code>h5py</code>或类似的东西。在</p>
<h2>从每个操作数中删除第一列</h2>
<p>这只是一个切片问题:</p>
<pre><code>a_no_id = a[:, 1:]
</code></pre>
<p>注意,与Python列表不同,NumPy数组在切片时不返回副本,而是返回一个视图。因此,效率(内存或运行时)在这里不是问题。在</p>