2011-03-16 130 views
12

是否有更好的pythonic方法来检查ndarray是否在特定维度上是对角对称的?即对于所有的x的测试numpy数组是否对称?

(arr[:,:,x].T==arr[:,:,x]).all() 

我敢肯定,我错过了(杜)的答案,但在这里它的2:15 ... :)

编辑:为了澄清,我正在寻找更多的“优雅”的方式来做到:

for x in range(xmax): 
    assert (arr[:,:,x].T==arr[:,:,x]).all() 
+2

我认为你的方法是完全合理的,我想不出一个内置函数来测试对称性,以更简洁/有效的方式做到这一点。 – JoshAdel 2011-03-16 03:07:39

回答

18

如果我理解正确的话,你想要做的检查

all((arr[:,:,x].T==arr[:,:,x]).all() for x in range(arr.shape[2])) 

没有Python的循环。这里是如何做到这一点:

(arr.transpose(1, 0, 2) == arr).all() 
12

如果阵列包含花车(特别是如果他们是一个计算的结果),使用allclose

np.allclose(arr.transpose(1, 0, 2), arr) 

如果一些值可能是NaN,在测试之前将它们设置为标记值。

arr[np.isnan(arr)] = 0 
+0

错字(括号而不是括号):arr [np.isnan(arr)] = 0 – Picarus 2014-04-27 11:29:00

+0

@Picarus谢谢。修复。 :) – 2014-04-27 13:34:29

+0

如果我没有弄错,'np.transpose'不应该改变它们的值,只能改变它们的位置,所以它们应该是相等的。 – moi 2016-06-28 20:43:17