массив numpy с диагональю равной нулю и [x, y] = - [y, x] - PullRequest
3 голосов
/ 25 октября 2019

Я хочу создать массив N x N в numpy так, чтобы диагональ была равна нулю, а [x,y] = -[y,x].

Например:

np.array([[[0,12, 2],
[-12, 0, 3],
[-2, -3, 0]],]) 

Значения внутри массива могут быть любыми числами с плавающей запятой.

Ответы [ 2 ]

5 голосов
/ 25 октября 2019

Один путь был бы с scipy.spatial.distance.squareform -

from scipy.spatial.distance import squareform

def diag_inverted(n):
    l = n*(n-1)//2
    out = squareform(np.random.randn(l))
    out[np.tri(len(out),k=-1,dtype=bool)] *= -1
    return out

Другой с array-assignment и masking -

def diag_inverted_v2(n):
    l = n*(n-1)//2
    m = np.tri(n, k=-1, dtype=bool)    
    out = np.zeros((n,n),dtype=float)
    out[m] = np.random.randn(l)
    out[m.T] = -out.T[m.T]
    return out

Пробные прогоны -

In [148]: diag_inverted(2)
Out[148]: 
array([[ 0.        , -0.97873798],
       [ 0.97873798,  0.        ]])

In [149]: diag_inverted(3)
Out[149]: 
array([[ 0.        , -2.2408932 , -1.86755799],
       [ 2.2408932 ,  0.        ,  0.97727788],
       [ 1.86755799, -0.97727788,  0.        ]])

In [150]: diag_inverted(4)
Out[150]: 
array([[ 0.        , -0.95008842,  0.15135721, -0.4105985 ],
       [ 0.95008842,  0.        ,  0.10321885, -0.14404357],
       [-0.15135721, -0.10321885,  0.        , -1.45427351],
       [ 0.4105985 ,  0.14404357,  1.45427351,  0.        ]])
4 голосов
/ 25 октября 2019

Вот, пожалуйста:

size = 3

a = np.random.normal(0,1, (size, size))

ret = (a-a.transpose())/2

Вывод (случайный):

array([[ 0.        ,  0.11872306,  0.46792054],
       [-0.11872306,  0.        ,  0.12530741],
       [-0.46792054, -0.12530741,  0.        ]])
...