は、ここで抽出後の放送減算用masking
ベースのアプローチだとマスクの作成のために我々は再びので、電源が入っbroadcasting
(ダブルbroadcasting
を利用しています)話をする -
r = np.arange(a.size)
out = (a[:, None] - a)[r[:,None] < r]
ランタイムテスト
ベクトル化が近づい -
# @user2357112's solution
def pairwise_diff_triu_indices_based(a):
return (a[:, None] - a)[np.triu_indices(len(a), k=1)]
# Proposed in this post
def pairwise_diff_masking_based(a):
r = np.arange(a.size)
return (a[:, None] - a)[r[:,None] < r]
タイミング -
In [109]: a = np.arange(2000)
In [110]: %timeit pairwise_diff_triu_indices_based(a)
10 loops, best of 3: 36.1 ms per loop
In [111]: %timeit pairwise_diff_masking_based(a)
100 loops, best of 3: 11.8 ms per loop
関与性能パラメータを詳しく見
のマスクベースのアプローチができますどのくらい勉強するために、この設定のタイミングにより深いビットを掘るしてみましょう。ここでは、比較のために、マスク作成とインデックスの作成、マスクベースのブールインデックスと整数ベースのインデックスの2つの部分があります。
どのくらいのマスク作成が役に立ちますか?インデックスの設定上にマスク作成上の5x
改善について
In [37]: r = np.arange(a.size)
In [38]: %timeit np.arange(a.size)
1000000 loops, best of 3: 1.88 µs per loop
In [39]: %timeit r[:,None] < r
100 loops, best of 3: 3 ms per loop
In [40]: %timeit np.triu_indices(len(a), k=1)
100 loops, best of 3: 14.7 ms per loop
。
整数インデックスにはどのくらいのブールインデックスが役立ちますか?ここ2.5x
改善について
In [41]: mask = r[:,None] < r
In [42]: idx = np.triu_indices(len(a), k=1)
In [43]: subs = a[:, None] - a
In [44]: %timeit subs[mask]
100 loops, best of 3: 4.15 ms per loop
In [45]: %timeit subs[idx]
100 loops, best of 3: 10.9 ms per loop
。
なぜ(n-1)!要素?それは2を選択する必要があるように私に見える。 – user2357112
はい、あなたは絶対に正しいです!それはnC2 –