【发布时间】:2018-02-05 16:33:26
【问题描述】:
我有一个 N 维数组。我想通过将最终维度的值放在对角线中,将其扩展为 (N+1) 维数组。
例如,使用显式循环:
In [197]: M = arange(5*3).reshape(5, 3)
In [198]: numpy.dstack([numpy.diag(M[i, :]) for i in range(M.shape[0])]).T
Out[198]:
array([[[ 0, 0, 0],
[ 0, 1, 0],
[ 0, 0, 2]],
[[ 3, 0, 0],
[ 0, 4, 0],
[ 0, 0, 5]],
[[ 6, 0, 0],
[ 0, 7, 0],
[ 0, 0, 8]],
[[ 9, 0, 0],
[ 0, 10, 0],
[ 0, 0, 11]],
[[12, 0, 0],
[ 0, 13, 0],
[ 0, 0, 14]]])
这是一个 5×3×3 的数组。
我的实际数组很大,我想避免显式循环(隐藏map 中的循环而不是列表推导没有性能提升;它仍然是一个循环)。尽管numpy.diag 可用于构造规则的二维对角矩阵,但它不会扩展到更高的维度(当给定二维数组时,它将提取其对角线)。 numpy.diagflat 返回的数组将所有内容都变成一个大对角线,从而产生一个 15×15 的数组,其中包含更多的零,并且无法重新整形为 5×3×3。
有没有一种方法可以有效地从 N 维数组中的值构造一个 (N+1) 对角矩阵,而无需多次调用 diag?
【问题讨论】:
标签: python arrays numpy multidimensional-array diagonal