Reputation: 7906
Is there a better pythonic way of checking if a ndarray is diagonally symmetric in a particular dimension? i.e for all of x
(arr[:,:,x].T==arr[:,:,x]).all()
I'm sure I'm missing an (duh) answer but its 2:15 here... :)
EDIT: to clarify, I'm looking for a more 'elegant' way to do :
for x in range(xmax):
assert (arr[:,:,x].T==arr[:,:,x]).all()
Upvotes: 14
Views: 18162
Reputation: 8234
I know you asked about NumPy. But SciPy, NumPy sister package, has a build-in function called issymmetric
to check if a 2D NumPy array is symmetric. You can use it too.
>>> 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
>>>
Upvotes: 1
Reputation: 20257
If your array contains floats (especially if they're the result of a computation), use allclose
np.allclose(arr.transpose(1, 0, 2), arr)
If some of your values might be NaN
, set those to a marker value before the test.
arr[np.isnan(arr)] = 0
Upvotes: 13
Reputation: 601499
If I understand you correctly, you want to do the check
all((arr[:,:,x].T==arr[:,:,x]).all() for x in range(arr.shape[2]))
without the Python loop. Here is how to do it:
(arr.transpose(1, 0, 2) == arr).all()
Upvotes: 21