Python中的算法相当于Q手动生成单位矩阵
Algorithm in Python equivalent to Q to manually generate identity matrix
我知道 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 数组。有没有办法避免这种复制? IE。我想在不离开 numpy
域的情况下执行 [i==r for i in r]
。
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]])
如果您的目标是以最有效的方式生成单位矩阵,我会推荐以下技巧:
>>> 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.]])
我知道 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 数组。有没有办法避免这种复制? IE。我想在不离开 numpy
域的情况下执行 [i==r for i in r]
。
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]])
如果您的目标是以最有效的方式生成单位矩阵,我会推荐以下技巧:
>>> 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.]])