Python中相当于Q的算法,用于手动生成单位矩阵

时间:2018-09-07 16:15:32

标签: python numpy kdb numpy-broadcasting

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

在Q(kdb +语言)中,我可以使用以下代码生成身份矩阵:

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

Python numpy等效项大致是这样:

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

使用Python方法时,在np.asarray期间无需复制数据,即可将Python数组转换回numpy数组。有办法避免这种复制吗?即我想执行[i==r for i in r]而不离开numpy域。

2 个答案:

答案 0 :(得分:2)

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]])

答案 1 :(得分:1)

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

>>> 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.]])