如何测试numpy数组是否对称?

14 投票
3 回答
17934 浏览
提问于 2025-04-16 13:47

有没有更好的方法来检查一个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()

撰写回答