如何在numpy中创建对角线多维(即大于2)

时间:2014-06-10 23:35:36

标签: numpy

是否存在高于(超过两个)维度的diag?

L = [...] # some arbitrary list.
A = ndarray.diag(L)

将创建一个对角线2-d矩阵形状=(len(L),len(L)),对角线上的元素为L。

我想做相同的事情:

length = len(L)
A = np.zeros((length, length, length))
for i in range(length):
    A[i][i][i] = L[i]

有没有灵巧的方法来做到这一点?

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用diag_indices来设置索引。例如,

x = np.zeros((3,3,3))
L = np.arange(6,9)

x[np.diag_indices(3,ndim=3)] = L

给出

array([[[ 6.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.]],

       [[ 0.,  0.,  0.],
        [ 0.,  7.,  0.],
        [ 0.,  0.,  0.]],

       [[ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  8.]]])

引擎盖下diag_indices只是Jaime发布的代码,所以使用它取决于你是想在一个numpy函数中拼写出来,还是DIY。

答案 1 :(得分:0)

您可以使用花式索引:

In [2]: a = np.zeros((3,3,3))

In [3]: idx = np.arange(3)

In [4]: a[[idx]*3] = 1

In [5]: a
Out[5]:
array([[[ 1.,  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.,  1.]]])

对于更通用的方法,您可以设置任意大小的数组的对角线,例如:

def set_diag(arr, values):
    idx = np.arange(np.min(arr.shape))
    arr[[idx]*arr.ndim] = values