擅长:python、mysql、java
<p>让:</p>
<pre><code>M=np.random.randint(0,3,(10,10))
n=np.random.randint(0,3,10)
</code></pre>
<p>做三倍并下降i=j:</p>
<pre><code>x,y=np.meshgrid(n,n)
a=np.dstack((x,y,M)).reshape(-1,3)
au=a[a [:,0]!=a[:,1]] # i<>j
</code></pre>
<p>unique的问题是它只使用1D数组。一个解决方案是在字符串中转换行:这样可以确保延迟比较,而且通常比较快。你知道吗</p>
<pre><code>c=np.frombuffer(au,dtype='S12') # 12 is 3*n.itemsize
_,indices,counts=np.unique(c,return_index=True,return_counts=True)
result=np.vstack((counts,au[indices].T)) # count first.
##
array([[1, 2, 5, 3, 4, 1, 4, 4, 3, 4, 9, 1, 3, 4, 9, 3, 4],
[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2],
[1, 1, 1, 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0, 1, 1, 1],
[0, 1, 2, 0, 1, 2, 0, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]], dtype=int64)
</code></pre>
<p>如果整数像这里这样小(<;4),则可以显示结果,以便<code>res[n(i),n(j),M(i,j)]</code>给出计数:</p>
<pre><code>res=np.zeros((3,3,3),int)
res[list(zip(*au[indices]))]=counts
</code></pre>