代码之家  ›  专栏  ›  技术社区  ›  Konstantin Spirin

Python等价于Q的手工生成单位矩阵算法

  •  0
  • Konstantin Spirin  · 技术社区  · 7 年前

    np.eye 生成单位矩阵。这个问题是关于算法,而不是关于最终结果。

    `float${x =\: x} til 12000
    

    import numpy as np
    r=np.arange(12000)
    np.asarray([i==r for i in r]).astype(float)
    

    使用Python方法时,在 np.asarray [i==r for i in r] 不离开 numpy

    2 回复  |  直到 7 年前
        1
  •  2
  •   hpaulj    7 年前
    In [822]: r=np.arange(4)
    

    您的列表理解:

    In [823]: [i==r for i in r]
    Out[823]: 
    [array([ True, False, False, False]),
     array([False,  True, False, False]),
     array([False, False,  True, False]),
     array([False, False, False,  True])]
    

    广播阵列等效物:

    In [824]: r[:,None]==r[None,:]
    Out[824]: 
    array([[ True, False, False, False],
           [False,  True, False, False],
           [False, False,  True, False],
           [False, False, False,  True]])
    

    In [825]: A = np.zeros((4,4),int)
    In [826]: A[np.arange(4),np.arange(4)] = 1
    In [827]: A
    Out[827]: 
    array([[1, 0, 0, 0],
           [0, 1, 0, 0],
           [0, 0, 1, 0],
           [0, 0, 0, 1]])
    

    或者(灵感来自 np.tri ):

    In [831]: np.equal.outer(np.arange(4), np.arange(4))
    Out[831]: 
    array([[ True, False, False, False],
           [False,  True, False, False],
           [False, False,  True, False],
           [False, False, False,  True]])
    
        2
  •  1
  •   Alexander Belopolsky    7 年前

    如果您的目标是以最有效的方式生成单位矩阵,我建议您使用以下技巧:

    >>> n = 5
    >>> e = np.zeros(n*n)
    >>> e[::n+1] = 1
    >>> e.reshape((n, n))
    array([[1., 0., 0., 0., 0.],
           [0., 1., 0., 0., 0.],
           [0., 0., 1., 0., 0.],
           [0., 0., 0., 1., 0.],
           [0., 0., 0., 0., 1.]])
    
    推荐文章