# Create a 2D Symmetric Array Subclass

A symmetric array has the same values across its diagonal axis, meaning the value at the i-th row and j-th column is equal to the value at the j-th row and i-th column. Symmetric arrays are useful in linear algebra, network analysis, and graph theory. NumPy offers various methods to create a 2D symmetric array, which are as follows:

#### 1. Using “np.triu()” and “np.tril()”:

Here, we first import the NumPy library and assign it the alias `np`. The `symmetric_array` function takes a NumPy array `arr` as input and returns a new array that is symmetric along its diagonal. It uses `np.triu()` to extract the upper triangular part of the input array. It then uses `np.tril()` to extract the lower triangular part of the transposed array (excluding the diagonal) by passing the transpose of the input array `arr.T` and a value of `-1` for `k`, which means that the diagonal elements are excluded. Finally, the function adds the upper and lower triangular parts together to create a symmetric array. The resulting array has the same shape as the input array, and each element `Z[i,j]` is equal to `Z[j,i]`. The code includes an example usage of the function.

#### 2. Using “np.triu_indices()” and “np.tril_indices()”:

Here, we first import the NumPy library and assign it the alias `np`. The `symmetric_array` function takes a square NumPy array `arr` as input and returns a new array `sym_arr` that is symmetric along its diagonal, creating an empty array `sym_arr` with the same shape as the input array. It then uses `np.triu_indices()` to get the indices of the upper triangular part of the array, and sets those values in the `sym_arr` using the `np.ndarray.__setitem__()` method. Next, it uses `np.tril_indices()` to get the indices of the lower triangular part of the transposed array (i.e., the diagonal values are excluded), and sets those values in the `sym_arr` using `np.ndarray.__setitem__()` method. Finally, it returns the resulting symmetric array `sym_arr`. The code includes an example usage of the function.