如何测试numpy数组是否对称?
有没有更好的方法来检查一个ndarray在某个特定维度上是否是对称的?也就是说,对于所有的x来说都是对称的。
(arr[:,:,x].T==arr[:,:,x]).all()
我知道我可能漏掉了一个(显而易见的)答案,但现在这里已经是凌晨2:15了... :)
补充说明一下,我想找一种更“优雅”的方法来做:
for x in range(xmax):
assert (arr[:,:,x].T==arr[:,:,x]).all()
3 个回答
1
我知道你问的是NumPy。不过,SciPy是NumPy的姐妹包,它里面有一个叫做issymmetric
的内置函数,可以用来检查一个二维的NumPy数组是否是对称的。你也可以使用这个函数。
>>> from scipy.linalg import issymmetric
>>> import numpy as np
>>> a = np.arange(27).reshape(3,3,3)
>>> a
array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]],
[[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]],
[[18, 19, 20],
[21, 22, 23],
[24, 25, 26]]])
>>> for i in range(a.shape[2]):
issymmetric(a[:,:,i])
False
False
False
>>>
13
如果你的数组里有浮点数(特别是这些浮点数是计算出来的),可以使用 allclose
这个方法。
np.allclose(arr.transpose(1, 0, 2), arr)
如果你的某些值可能是 NaN
(表示“不是一个数字”),在测试之前,先把这些值设置成一个标记值。
arr[np.isnan(arr)] = 0
21
如果我理解得没错,你是想要进行检查
all((arr[:,:,x].T==arr[:,:,x]).all() for x in range(arr.shape[2]))
而不使用Python的循环。下面是怎么做的:
(arr.transpose(1, 0, 2) == arr).all()