<p>在MATLAB中,用两个列表(实际上是矩阵)建立索引来选择一个块。<code>numpy</code>另一方面,尝试相互广播索引数组,并返回选定的点。它的行为接近于<code>sub2ind</code>在MATLAB中的行为。你知道吗</p>
<pre><code>In [971]: arr = np.arange(16).reshape(4,4)
In [972]: arr
Out[972]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
In [973]: i1, i2 = np.array([0,2,3]), np.array([1,2,0])
</code></pre>
<p>使用2个相同大小的1d数组进行索引:</p>
<pre><code>In [974]: arr[i1,i2]
Out[974]: array([ 1, 10, 12])
</code></pre>
<p>这实际上返回<code>[arr[0,1], arr[2,2], arr[3,0]]</code>,匹配索引的每个点对应一个元素。你知道吗</p>
<p>但是如果我把一个索引转换成一个“列向量”,它从行中选择,而<code>i2</code>从列中选择。你知道吗</p>
<pre><code>In [975]: arr[i1[:,None], i2]
Out[975]:
array([[ 1, 2, 0],
[ 9, 10, 8],
[13, 14, 12]])
</code></pre>
<p>MATLAB使块索引变得容易,而单独访问则更难。在<code>numpy</code>中,块访问有点困难,尽管底层机制是相同的。你知道吗</p>
<p>在您的示例中,<code>i1[0]</code>和<code>i2[0]</code>可以是如下数组:</p>
<pre><code>array([0, 2]), array([3])
(2,) (1,)
</code></pre>
<p>形状(1,)数组可以与(2,)或(2,1)数组一起广播。如果<code>is[0]</code>取而代之的是<code>np.array([0,1,2])</code>,一个不能与(2,)数组配对的(3,)数组,那么代码将失败。但是用(2,1)它就产生了(2,3)块。你知道吗</p>