如何在numpy中从现有数组创建对角线数组

时间:2017-05-11 20:08:42

标签: python arrays numpy diagonal

我试图从:

制作一个对角线的numpy数组
[1,2,3,4,5,6,7,8,9]

预期结果:

[[ 0,  0,  1,  0,  0],
 [ 0,  0,  0,  2,  0],
 [ 0,  0,  0,  0,  3],
 [ 4,  0,  0,  0,  0],
 [ 0,  5,  0,  0,  0],
 [ 0,  0,  6,  0,  0],
 [ 0,  0,  0,  7,  0],
 [ 0,  0,  0,  0,  8],
 [ 9,  0,  0,  0,  0]]

这样做的有效方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以使用integer array indexing设置输出的指定元素:

>>> import numpy as np
>>> a = [1,2,3,4,5,6,7,8,9]
>>> arr = np.zeros((9, 5), dtype=int)           # create empty array
>>> arr[np.arange(9), np.arange(2,11) % 5] = a  # insert a 
>>> arr
array([[0, 0, 1, 0, 0],
       [0, 0, 0, 2, 0],
       [0, 0, 0, 0, 3],
       [4, 0, 0, 0, 0],
       [0, 5, 0, 0, 0],
       [0, 0, 6, 0, 0],
       [0, 0, 0, 7, 0],
       [0, 0, 0, 0, 8],
       [9, 0, 0, 0, 0]])

答案 1 :(得分:1)

np.fill_diagonal的启发,它可以包裹但不能抵消:

In [308]: arr=np.zeros((9,5),int)
In [309]: arr.flat[2:45:6]=np.arange(1,10)
In [310]: arr
Out[310]: 
array([[0, 0, 1, 0, 0],
       [0, 0, 0, 2, 0],
       [0, 0, 0, 0, 3],
       [0, 0, 0, 0, 0],
       [4, 0, 0, 0, 0],
       [0, 5, 0, 0, 0],
       [0, 0, 6, 0, 0],
       [0, 0, 0, 7, 0],
       [0, 0, 0, 0, 8]])

(虽然由于某种原因,它有第4个全零行。)

def fill_diagonal(a, val, wrap=False):
    ...       
    step = a.shape[1] + 1
    # Write the value out into the diagonal.
    a.flat[:end:step] = val