有没有一种快速的方法来替换仅包含1和-1的np.array元素

时间:2020-01-31 21:40:15

标签: python numpy

比方说,M是形状为(1024,1024)的2D numpy数组,其条目的值为1或-1。我想用x替换每个条目exp(-x)。是否有比使用numpy.exp(-M)函数更快的方法,以便它利用输入矩阵的元素仅采用少量不同值的事实?

2 个答案:

答案 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]]

实际上,只要必须将值pq的矩阵转换为值rs的矩阵,就可以使用这种线性变换。一个只需要解决系统

r = p * a + b
s = q * a + b

ab。通用解决方案是

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)