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

Python 如何从numpy中的现有数组创建对角线数组,python,arrays,numpy,diagonal,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,

我正在尝试从以下内容制作一个对角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]]
执行此操作的有效方法是什么?

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

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

灵感来源于
np.填充\u对角线
,它可以包裹,但不能偏移:

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]])
(尽管出于某种原因,这有第四行全零)


你的投入和预期产出之间有什么关系?到目前为止你试过什么了吗?除了列表之外,还有什么输入参数?
np.fill\u diagonal
有这样一个
wrap
模式,但它只适用于主对角线。另一个
diag
函数允许偏移,但不允许换行。您丢失了
9
,第四行似乎是错误的。使用
步骤
非常有效,直到您在最后一列中有一个值,并在下一行第一列中期望下一个值:)是的,我对此感到困惑。我将保留答案,以防有人看到此“跨步”解决方案中的缺陷。嗯,缺陷是您需要不同的“步骤”“.6用于第1->2,2->3,4->5,5->6,6->7,7->8行,但只有1用于第3->4和8->9行。在版本1.6之前,
fill\u diagonal
的默认包装样式。因此,当排列正确时,6的步幅跳过整个长度为5的行。
def fill_diagonal(a, val, wrap=False):
    ...       
    step = a.shape[1] + 1
    # Write the value out into the diagonal.
    a.flat[:end:step] = val