<p>由于数组包含整数,因此可以将每个三元组视为可线性索引的元素。这里有一种方法,它将哲学铭记在心,从而避免循环,就像这样-</p>
<pre><code># Form n(i) x n(j) array and then append with "columnar" M(i,j) array
nn_arr = n[np.array(list(itertools.product(range(5), repeat=2)))]
nn_M_arr = np.concatenate((nn_arr,M.reshape(-1,1)),axis=1)
# Get linear indices version
dims = nn_M_arr.max(0)+1
lidx = np.ravel_multi_index(nn_M_arr.T,dims)
# Get unique indices and the counts
_, idx, counts = np.unique(lidx,return_index=True,return_counts=True)
# Get corresponding unique triplets using unique indices and zip with counts
out = zip(map(tuple,nn_M_arr[idx]),counts)
</code></pre>
<p>样本运行-</p>
<pre><code>In [206]: M
Out[206]:
array([[1, 0, 0, 2, 0],
[1, 1, 2, 0, 2],
[0, 0, 2, 0, 1],
[2, 1, 2, 0, 2],
[1, 1, 1, 1, 0]])
In [207]: n
Out[207]: array([0, 1, 1, 1, 2])
In [208]: out
Out[208]:
[((0, 0, 1), 1),
((0, 1, 0), 2),
((0, 1, 2), 1),
((0, 2, 0), 1),
((1, 0, 0), 1),
((1, 0, 1), 1),
((1, 0, 2), 1),
((1, 1, 0), 4),
((1, 1, 1), 2),
((1, 1, 2), 3),
((1, 2, 1), 1),
((1, 2, 2), 2),
((2, 0, 1), 1),
((2, 1, 1), 3),
((2, 2, 0), 1)]
</code></pre>