擅长:python、mysql、java
<pre><code>In [258]: vec=np.arange(24).reshape(4,3,2)
In [263]: idx=np.array([[0,0],[1,1],[3,2]])
In [264]: idx.shape
Out[264]: (3, 2)
In [265]: vec[idx,:].shape
Out[265]: (3, 2, 3, 2)
</code></pre>
<p>直接用<code>idx</code>索引可以有效地用这个(3,2)数组替换第一个维度(大小为4)。换句话说,它为<code>idx</code>中的所有6个值选择<code>vec[i,:,:]</code>。你知道吗</p>
<p>Divakar建议:</p>
<pre><code>In [266]: vec[idx[:,0], idx[:,1],:]
Out[266]:
array([[ 0, 1],
[ 8, 9],
[22, 23]])
</code></pre>
<p>它使用<code>idx</code>的第一列索引第一个维度,第二列索引第二个维度。你知道吗</p>
<p>List zip也可以工作,但需要<code>*</code>:</p>
<pre><code>In [267]: list(zip(*idx))
Out[267]: [(0, 1, 3), (0, 1, 2)]
In [268]: vec[list(zip(*idx))]
Out[268]:
array([[ 0, 1],
[ 8, 9],
[22, 23]])
</code></pre>
<p>与第一个答案一样,它用(0,1,3)索引第一个dim。如果<code>idx</code>是一个列表列表而不是一个数组,那么它就可以工作。等效数组为:</p>
<pre><code>In [272]: tuple(idx.T)
Out[272]: (array([0, 1, 3]), array([0, 1, 2]))
</code></pre>
<p>总之,要在2维中选取<code>n</code>项,需要2个<code>n</code>元素列表/数组。你知道吗</p>