【问题标题】:Creating a symmetric array with power of an element创建具有元素幂的对称数组
【发布时间】:2020-01-01 09:06:55
【问题描述】:

我正在尝试创建一个与放置如下元素对称的数组

我编写了以下代码来获取此表单,参数为 0.5,维度为 4-by-4

import numpy as np
a = np.eye(4)
for i in range(4):
    for j in range(4):
        a[i, j] = (0.5) ** (np.abs(i-j))

这可以满足我的需要,但是对于大尺寸(1000 秒),这会导致大量开销。有没有其他低复杂度的方法来得到这个矩阵?谢谢。

【问题讨论】:

    标签: python numpy for-loop matrix symmetric


    【解决方案1】:

    我们可以在创建一个范围数组来表示迭代器变量之后利用broadcasting 来模拟i-j 部分-

    n = 4
    p = 0.5
    I = np.arange(n)
    out = p ** (np.abs(I[:,None]-I))
    

    优化 #1

    我们可以使用indexing 进行基于散列的计算,这样我们就可以优化昂贵的功率计算,就像这样 -

    out = (p**np.arange(n))[(np.abs(I[:,None]-I))]
    

    优化 #2

    我们可以通过numexpr 进一步优化以使用多核 -

    import numexpr as ne
    
    out = ne.evaluate('p**abs(I2D-I)',{'I2D':I[:,None],'I':I})
    

    【讨论】:

    • 谢谢,广播正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 2016-11-16
    • 1970-01-01
    • 2023-04-07
    • 2021-08-12
    • 1970-01-01
    相关资源
    最近更新 更多