2017-03-23 8 views
0

numpyの配列maskの長さはnです。私はまた0(両端を含む)からn-1(両端を含む)の範囲の数を含む長さ< = nnumpy配列aを持っていて、重複を含んでいません。計算したいクエリはnp.array([x for x in a if mask[x]])ですが、これを実行する最も速い方法ではないと思います。このnumpyクエリを高速に計算する

numpyの方が、私が書いた方法よりも速い方法がありますか?

答えて

1

これを行う最も簡単な方法は、単にa[mask[a]]です。私はマスクのカバレッジ、p(真のアイテムの数/ n)に依存して、2つの方法の速度の違いを示す簡単なテストを書いた。私は、このプロット

enter image description here

を与えた

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() 

だから、この方法にかかわらず、マスクの適用範囲の全体の多くより速いです。

関連する問題