Outer Sum(ブロードキャストを用いる様な和の効率的な計算)

Outer sum of coordinates – StackOverflow

空間効率を気にしなければ,broadcastingは十分に効率的だが,numexprを用いれば簡便に高速化が見込める.ただ,時間効率を求めるのであれば,然程手間でも無いし,numbaを用いる方がリーズナブルかな.

import numpy as np
import numexpr as ne
from numba import jit


@jit(nopython=True, parallel=True, fastmath=True)
def func(a, b):
    ar = a.shape[0]
    br, bc = b.shape
    out = np.empty((ar, br, bc), dtype=a.dtype)
    for i in range(ar):
        for j in range(br):
            for k in range(bc):
                out[i, j, k] = a[i, k] * b[j, k]
    return out


np.random.seed(0)
a = np.random.rand(10000, 3)
b = np.random.rand(10000, 3)

res1 = a[:, None] * b
res2 = ne.evaluate('a3D+b', {'a3D': a[:, None]})
res3 = func(a, b)

# np.testing.assert_allclose(res1, res2)
# np.testing.assert_allclose(res1, res3)

%timeit a[:, None] + b
%timeit ne.evaluate('a3D+b', {'a3D': a[:, None]})
%timeit func(a, b)
1 loop, best of 3: 1.54 s per loop
1 loop, best of 3: 1.08 s per loop
1 loop, best of 3: 593 ms per loop
広告
カテゴリー: 未分類 パーマリンク

Outer Sum(ブロードキャストを用いる様な和の効率的な計算) への1件のフィードバック

  1. ピンバック: NumPy行列を生成するためのベクトル化された方法 | 粉末@それは風のように (日記)

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください