我有一个多维数组,以\uhhhh
启动。然后我尝试通过一些公式(在这种情况下为>>> print repr(u'Łukasz')
u'\u0141ukasz'
)为C分配一些值。以下代码有效,但非常慢。
C=np.zeros([20,20,20,20])
这可以通过更快,更可能更诡异的方式完成吗?
答案 0 :(得分:2)
这是一种方法。
步骤#1 获取与代码中使用np.array(it.multi_index)
计算的所有索引相对应的所有组合。在此,人们可以利用product from itertools
。
步骤#2 以矢量化方式对所有组合执行L2范数计算。
第3步最后以元素方式执行C(x)=(exp(-|x|^2)
。
# Get combinations using itertools.product
combs = np.array(list(product(range(N), repeat=4)))
# Perform L2 norm and elementwise exponential calculations to get final o/p
out = np.exp(-np.sqrt((combs**2).sum(1))**2).reshape(N,N,N,N)
运行时测试并验证输出 -
In [42]: def vectorized_app(N):
...: combs = np.array(list(product(range(N), repeat=4)))
...: return np.exp(-np.sqrt((combs**2).sum(1))**2).reshape(N,N,N,N)
...:
...: def original_app(N):
...: C=np.zeros([N,N,N,N])
...: it=np.nditer(C, flags=['multi_index'], op_flags=['readwrite'])
...: while not it.finished:
...: diff_n=np.linalg.norm(np.array(it.multi_index))
...: it[0]=np.exp(-diff_n**2)
...: it.iternext()
...: return C
...:
In [43]: N = 10
In [44]: %timeit original_app(N)
1 loops, best of 3: 288 ms per loop
In [45]: %timeit vectorized_app(N)
100 loops, best of 3: 8.63 ms per loop
In [46]: np.allclose(vectorized_app(N),original_app(N))
Out[46]: True
答案 1 :(得分:1)
所以看起来你不想将你的操作应用到每个元素的索引上?怎么样:
x = np.exp(-np.linalg.norm(np.indices([20,20,20,20]), axis=0)**2)
np.indices是一个非常灵活的功能。还有相关的是mgrid和meshgrid,用于更复杂的操作。在这种情况下,由于您有4个维度,它将返回一个具有形状(4,20,20,20,20)的数组。
纯粹的numpy有点快:)
In [13]: timeit posted_code()
1 loops, best of 3: 843 ms per loop
In [14]: timeit np.exp(-np.linalg.norm(np.indices([20,20,20,20]), axis=0)**2)
100 loops, best of 3: 3.76 ms per loop
结果完全相同:
In [26]: np.all(C == x)
Out[26]: True