计算此numpy查询的快速方法

计算此numpy查询的快速方法,numpy,optimization,Numpy,Optimization,我有一个长度为n的布尔numpy数组mask。我还有一个长度的numpy数组a,看起来最快的方法就是a[mask[a]]。我写了一个快速测试,它显示了两种方法的速度差异,这取决于掩码的覆盖率,p(真实项目数/n) 这给了我这个阴谋 因此,无论遮罩的覆盖范围如何,这种方法都要快得多 import timeit import matplotlib.pyplot as plt import numpy as np n = 10000 p = 0.25 slow_times = [] fast_tim

我有一个长度为
n
的布尔
numpy
数组
mask
。我还有一个长度的
numpy
数组
a
,看起来最快的方法就是
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()