【问题标题】:Creating a 3-D (or larger) diagonal NumPy array from diagonals从对角线创建 3-D(或更大)对角线 NumPy 数组
【发布时间】:2021-01-20 07:37:53
【问题描述】:

是否有基于“Numpy”的高效解决方案来创建 3(或更高)维对角矩阵?

更具体地说,我正在寻找一种更短(也许更有效)的解决方案来替换以下内容:

N = 100
M = 4
d = np.random.randn(N)   # calculated in the real use case from other parameters
A = np.zeros(M, M, N, dtype=d.dtype)
for i in range(M):
    A[i, i, :] = d

如果M 很大,上述解决方案会很慢,而且我认为内存效率不是很高,因为d 在内存中被复制了M 次。

【问题讨论】:

    标签: python-3.x numpy numpy-ndarray


    【解决方案1】:

    这是np.einsum diag-view -

    np.einsum('iij->ij',A)[:] =  d
    

    查看字符串表示法,这也可以很好地从迭代部分翻译:A[i, i, :] = d

    ellipsis泛化到ndarray -

    np.einsum('ii...->i...',A)[:] =  d
    

    【讨论】:

    • 但这仍然需要提前定义A,对吗?我希望找到类似A = some_magic_function(d, M)?
    • @kMaster 并且初始化A = np.zeros((M, M, N), dtype=d.dtype) 让你烦恼吗?
    • 是的,主要是因为这意味着我们为这个数组分配了M*M*N内存元素,而只有N元素应该足以存储这样一个数组。
    • @kMaster 您可能希望存储在稀疏矩阵中?遗憾的是没有 3D 或更高版本。
    猜你喜欢
    • 1970-01-01
    • 2015-05-09
    • 2022-01-26
    • 2012-06-05
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    相关资源
    最近更新 更多