比方说,M是形状为(1024,1024)的2D numpy数组,其条目的值为1或-1。我想用x
替换每个条目exp(-x)
。是否有比使用numpy.exp(-M)
函数更快的方法,以便它利用输入矩阵的元素仅采用少量不同值的事实?
答案 0 :(得分:4)
这是您需要的吗?如果是这样,我认为这比涉及条件评估的任何操作都要快(而且比Mark Snyder所展示的使用np.exp()
还要快-谢谢Mark)。
import numpy as np
from math import e
M = np.random.randint(2, size=(1024,1024)) * 2 - 1
a = (1/e - e) / 2
b = (1/e + e) / 2
E = M * a + b
print(M[:3,:3])
# [[-1 1 1]
# [-1 -1 1]
# [-1 1 -1]]
print(E[:3,:3])
# [[2.71828183 0.36787944 0.36787944]
# [2.71828183 2.71828183 0.36787944]
# [2.71828183 0.36787944 2.71828183]]
实际上,只要必须将值p
和q
的矩阵转换为值r
和s
的矩阵,就可以使用这种线性变换。一个只需要解决系统
r = p * a + b
s = q * a + b
a
和b
。通用解决方案是
a = (r - s) / (p - q)
b = r - p * a = s - q * a = (p * s - q * r) / (p - q)
答案 1 :(得分:1)
初始解决方案的一些基准测试与Walter Tross的回答:
timeit np.exp(-M)
9.29 ms ± 57.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
timeit M*a+b
6.42 ms ± 18.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)