擅长:python、mysql、java
<p>下面是一个使用<code>np.lexsort</code>的函数:</p>
<pre class="lang-py prettyprint-override"><code>def is_symmetric(A, R, *args, **kwargs):
A = np.asanyarray(A)
A = A[np.lexsort(A.T)]
A_t = A @ np.asanyarray(R).T
A_t = A_t[np.lexsort(A_t.T)]
return np.allclose(A, A_t, *args, **kwargs)
</code></pre>
<p>一些结果:</p>
<pre class="lang-py prettyprint-override"><code>R = np.array([[0, -1, 0], # 90° rotation as an example
[1, 0, 0],
[0, 0, 1]])
is_symmetric([[0, 0, 0]], R)
# True
is_symmetric([[1, 0, 0],
[0, 1, 0],
[0, 0, 0]], R)
# False
is_symmetric([[1, 0, 0],
[0, 1, 0],
[0, 0, 0],
[-1, 0, 0]], R)
# False
is_symmetric([[1, 0, 0],
[0, 1, 0],
[0, 0, 0],
[-1, 0, 0],
[0, -1, 0]], R)
# True
</code></pre>
<hr/>
<p>对于100000个随机向量,性能似乎很好:</p>
<pre class="lang-py prettyprint-override"><code>A = np.random.rand(100000, 3)
%timeit is_symmetric(A, R)
# 82.2 ms ± 75.4 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
</code></pre>