擅长:python、mysql、java
<p>您可以使用<code>np.ix_</code>获得以下行为:</p>
<pre><code>A = np.arange(9).reshape(3, 3)
A[[1,2],[0,2]]
# array([3, 8])
A[np.ix_([1,2],[0,2])]
# array([[3, 5],
# [6, 8]])
</code></pre>
<p>在引擎盖下,<code>np.ix_</code>执行@hpaulj详细描述的操作:</p>
<pre><code>np.ix_([1,2],[0,2])
# (array([[1],
# [2]]), array([[0, 2]]))
</code></pre>
<p>您可以将此应用于您的特定问题,如下所示:</p>
<pre><code>M = np.random.randint(0, 10, (n, n))
M
# array([[6, 2, 7, 1],
# [6, 7, 9, 5],
# [9, 4, 3, 2],
# [3, 1, 7, 9]])
idx = np.array([0, 1, 0, 2])
ng = idx.max() + 1
out = np.zeros((ng, ng), M.dtype)
np.add.at(out, np.ix_(idx, idx), M)
out
# array([[25, 6, 3],
# [15, 7, 5],
# [10, 1, 9]])
</code></pre>
<p>旁白:有一种更快但不太明显的解决方案依赖于平面索引:</p>
<pre><code>np.bincount(np.ravel_multi_index(np.ix_(idx, idx), (ng, ng)).ravel(), M.ravel(), ng*ng).reshape(ng, ng)
# array([[25., 6., 3.],
# [15., 7., 5.],
# [10., 1., 9.]])
</code></pre>