Python 对角线等于零且[x,y]=-[y,x]的numpy数组

Python 对角线等于零且[x,y]=-[y,x]的numpy数组,python,numpy,numpy-ndarray,Python,Numpy,Numpy Ndarray,我想在numpy中创建一个nxn数组,使对角线为零,[x,y]=-[y,x] 例如: np.array([[[0,12, 2], [-12, 0, 3], [-2, -3, 0]],]) 数组中的值可以是任何浮点。一种方法是使用- 另一个具有数组分配和掩蔽- def diag_inverted_v2(n): l = n*(n-1)//2 m = np.tri(n, k=-1, dtype=bool) out = np.zeros((n,n),dtype=flo

我想在
numpy
中创建一个
nxn
数组,使对角线为零,
[x,y]=-[y,x]

例如:

np.array([[[0,12, 2],
[-12, 0, 3],
[-2, -3, 0]],]) 
数组中的值可以是任何浮点。

一种方法是使用-

另一个具有
数组分配
掩蔽
-

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.        ]])
给你:

size = 3

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

ret = (a-a.transpose())/2
输出(随机):


我想要[x,y]=-[y,x],所以上面的解决方案非常好。我只是想知道这些解决方案和@QuangHoang?@codingknob发布的解决方案有什么区别。我认为,获得所需输出的方法不同。@QuangHoang的解决方案有更多的算术运算,所以这可能是一个很大的区别。@codingknob实际上,这里的解决方案更好,因为它们不会在每个位置减去两个不同的随机数。对于正态分布,后者正好起作用(虽然它改变了方差),但是如果你想要一个均匀分布,那么祝你好运。为什么你要除以二?既然你提到了,我看不出有什么理由:-)。谢谢
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.        ]])