比方说你有apxq numpy的2D阵列A,这里是与(P,Q)作为样品(3,4):
In []: A = np.arange(1,13).reshape(4,3)
In []: A
Out[]:
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
Step 1:
要插入对角线零,它需要制作一个新的形状为px q + 1的二维数组。
在此之前,我们创建与非对角线元素的列索引值的2D阵列的新的二维阵列是这样
In []: columnIndexArray = np.delete(np.meshgrid(np.arange(q+1), np.arange(p))[0], np.arange(0, p * (q+1), q+2)).reshape(p,q)
的输出上述将如下所示:
In []: columnIndexArray
Out[]:
array([[1, 2, 3],
[0, 2, 3],
[0, 1, 3],
[0, 1, 2]])
Step 2:
现在构造PX q + 1个2d中的零的这样
阵列
In []: B = np.zeros((p,q+1))
In []: B
Out[]:
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
Step 3:
现在从A
In []: B[np.arange(p)[:,None], columnIndexArray] = A
In []: B
Out[]:
array([[ 0., 1., 2., 3.],
[ 4., 0., 5., 6.],
[ 7., 8., 0., 9.],
[ 10., 11., 12., 0.]])
Note:
分配与所述值的非对角元素要使代码动态与A.shape [0]和q与A.shape替换p [1]。
形状总是'(4,3)'?有什么限制吗?如果您尝试在形状为((3,4))的阵列中插入对角线,您想要什么? – mgilson
原始形状总是像这样(n + 1,n),其中n> 0,但我更喜欢如果答案也适用于(n,n)。 –
我会创建一个新的数组(零),并使用'np.tri ...'函数将旧数组的上下三角形复制到新数组中。 – hpaulj