Python 带交替值的numpy矩阵对角填充

Python 带交替值的numpy矩阵对角填充,python,numpy,Python,Numpy,我正在寻找一种有效的方法,沿着矩阵的对角线写一个交替值。例如 array([[1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1

我正在寻找一种有效的方法,沿着矩阵的对角线写一个交替值。例如

array([[1, 0, 0, 0, 0, 0, 0, 0, 0],
   [0, 0, 0, 0, 0, 0, 0, 0, 0],
   [0, 0, 1, 0, 0, 0, 0, 0, 0],
   [0, 0, 0, 0, 0, 0, 0, 0, 0],
   [0, 0, 0, 0, 1, 0, 0, 0, 0],
   [0, 0, 0, 0, 0, 0, 0, 0, 0],
   [0, 0, 0, 0, 0, 0, 1, 0, 0],
   [0, 0, 0, 0, 0, 0, 0, 0, 0],
   [0, 0, 0, 0, 0, 0, 0, 0, 1]])
尝试np.eye和一些切片:

import numpy as np
a = np.eye(9)
a[1::2] = 0
print(a)
输出:

array([[1., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 1., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 1., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 1., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 1.]])
尝试np.eye和一些切片:

import numpy as np
a = np.eye(9)
a[1::2] = 0
print(a)
输出:

array([[1., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 1., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 1., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 1., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 1.]])
例如:

k = 9
np.diag(([1,0]*((k+1)//2))[:k])

例如:

k = 9
np.diag(([1,0]*((k+1)//2))[:k])

np.diag使用了一个平面赋值技巧。在这种情况下,它可以通过以下方式简化:

a=np.zeros((9,9))
a.flat[10::20]=1  
事实证明,这比目前提出的备选方案要快得多:

In [108]: timeit a=np.zeros((9,9)); a.flat[10::20]=1                                             
1.5 µs ± 10.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [110]: timeit np.diag(([1,0]*((k+1)//2))[:k])                                                 
10.1 µs ± 29.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [111]: timeit a=np.eye(9); a[1::2]=0                                                          
6.74 µs ± 20 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
eye方法将整行设置为0,但由于这是通过广播完成的,因此速度相对较快。

np.diag使用平面分配技巧。在这种情况下,它可以通过以下方式简化:

a=np.zeros((9,9))
a.flat[10::20]=1  
事实证明,这比目前提出的备选方案要快得多:

In [108]: timeit a=np.zeros((9,9)); a.flat[10::20]=1                                             
1.5 µs ± 10.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [110]: timeit np.diag(([1,0]*((k+1)//2))[:k])                                                 
10.1 µs ± 29.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [111]: timeit a=np.eye(9); a[1::2]=0                                                          
6.74 µs ± 20 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

“眼睛法”将整行设置为0,但由于这是通过广播完成的,因此速度相对较快。

您尝试过什么吗?您尝试过什么吗?