デカルト積(Cartesian product)なループ ~ Broadcasting

Filling numpy matrix with function calculated over iterables – StackOverflow

「numpy.ix_」はあまり使った事が無かったので,実効性を確認.

import numpy as np


def func1(a, b):
  a = np.asarray(a)
  b = np.asarray(b)
  z = np.exp(a[:,None] + b)
  return z / (1 + z)


def func2(a, b):
  x,y = np.ix_(a, b)
  z = np.exp(x + y)
  return z / (1 + z)


def func3(a, b):
  z = np.exp(np.add.outer(a, b))
  return z / (1 + z)


a = range(400)
b = range(300)
assert np.allclose(func1(a, b), func2(a, b)), 'different'
assert np.allclose(func1(a, b), func3(a, b)), 'different'
%timeit func1(a, b)
%timeit func2(a, b)
%timeit func3(a, b)
100 loops, best of 3: 3.8 ms per loop
100 loops, best of 3: 3.92 ms per loop
100 loops, best of 3: 3.73 ms per loop

色々な条件で比較したが,msオーダー以下の差しか無いので,
方法としては,どれをチョイスするのも好みだろう.
この場合だと,パット見で分かり易いのは「numpy.add.outer」だし,
トライアンドエラーで一つずつ考える場合は,「a[:,None] + b」かなと.
また,dtypeを意識しなければいけないシチュエーションでも,
愚直にやる方がベネフィットは大きいかなと思う.
「np.ix_」は逆にディメンションのイメージがしっかりしていないと,
途中で何がどうなっているのか分かり難くなって詰まりそう.

カテゴリー: 未分類 パーマリンク

デカルト積(Cartesian product)なループ ~ Broadcasting への1件のフィードバック

  1. ピンバック: デカルト積(Cartesian Product)な配列(アレイ)を求める場合は「sklearn.utils.extmath.cartesian」 | 粉末@それは風のように (日記)

コメントを残す

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

WordPress.com ロゴ

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

Google フォト

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

Twitter 画像

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

Facebook の写真

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

%s と連携中

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