创建具有元素幂的对称数组

Creating a symmetric array with power of an element

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

我写了下面的代码来得到这个参数为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 秒),这会导致大量开销。有没有其他低复杂度的方法来得到这个矩阵?谢谢

我们可以利用 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})