我有一个长度为numpy
的布尔mask
数组n
。我还有一个长度为< = numpy
的{{1}}数组a
,其中包含从n
(含)到0
(含)的数字,以及不包含重复项。我想要计算的查询是n-1
,但我不认为这是最快的方法。
在np.array([x for x in a if mask[x]])
中执行此操作的方式是否比我刚写的方式更快?
答案 0 :(得分:1)
看起来最简单的方法就是a[mask[a]]
。我写了一个快速测试,它显示了两种方法的速度差异,具体取决于掩码的覆盖范围,p(真实项目的数量/ n)。
import timeit
import matplotlib.pyplot as plt
import numpy as np
n = 10000
p = 0.25
slow_times = []
fast_times = []
p_space = np.linspace(0, 1, 100)
for p in p_space:
mask = np.random.choice([True, False], n, p=[p, 1 - p])
a = np.arange(n)
np.random.shuffle(a)
y = np.array([x for x in a if mask[x]])
z = a[mask[a]]
n_test = 100
t1 = timeit.timeit(lambda: np.array([x for x in a if mask[x]]), number=n_test)
t2 = timeit.timeit(lambda: a[mask[a]], number=n_test)
slow_times.append(t1)
fast_times.append(t2)
plt.plot(p_space, slow_times, label='slow')
plt.plot(p_space, fast_times, label='fast')
plt.xlabel('p (# true items in mask)')
plt.ylabel('time (ms)')
plt.legend()
plt.title('Speed of method vs. coverage of mask')
plt.show()
这给了我这个情节
因此无论掩模的覆盖范围如何,这种方法都要快得多。