创建具有元素幂的对称数组
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})
我正在尝试创建一个与如下放置的元素对称的数组
我写了下面的代码来得到这个参数为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})