是否存在高于(超过两个)维度的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]
有没有灵巧的方法来做到这一点?
谢谢!
答案 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