我有一个浮点数ndarray(a)和一个0或1(b)的列表. a和b具有相同的长度,通常为1000.我想对索引与b中的1对应的a的元素应用一个简单的函数(例如,减去逆数).
以下方法花费不到1毫秒的时间.是否有可能使其更快?
import numpy as np
# generate dummy data
n = 1000
a = np.random.uniform(low=0, high=10, size=n)
b = np.random.choice(2, 1000)
# map the function
start = time.time()
out = [a[i] if b[i] == 0 else -1/a[i] for i in range(n)]
print time.time() - start
解决方法:
使用b作为遮罩,并相应地设置a的单元格:
m = np.array(b).astype(bool)
a[m] = -1 / a[m]
更好的是,使用np.random.choice初始化b:
b = np.random.choice(2, 1000).astype(bool)
现在,您无需将b转换为数组的开销,只需将其直接用于索引a:
a[b] = -1 / a[b]
这在
22.3 µs ± 501 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
标签:python,arrays,performance,numpy
来源: https://codeday.me/bug/20191011/1894103.html