PythonのR expand.grid()関数 質問する

PythonのR expand.grid()関数 質問する

R の expand.grid() 関数に似た Python 関数はありますか? よろしくお願いします。

(編集) 以下はこの R 関数の説明と例です。

Create a Data Frame from All Combinations of Factors

Description:

     Create a data frame from all combinations of the supplied vectors
     or factors.  

> x <- 1:3
> y <- 1:3
> expand.grid(x,y)
  Var1 Var2
1    1    1
2    2    1
3    3    1
4    1    2
5    2    2
6    3    2
7    1    3
8    2    3
9    3    3

(編集2) 以下は rpy パッケージの例です。R を使用せずに同じ出力オブジェクトを取得したいと思います。

>>> from rpy import *
>>> a = [1,2,3]
>>> b = [5,7,9]
>>> r.assign("a",a)
[1, 2, 3]
>>> r.assign("b",b)
[5, 7, 9]
>>> r("expand.grid(a,b)")
{'Var1': [1, 2, 3, 1, 2, 3, 1, 2, 3], 'Var2': [5, 5, 5, 7, 7, 7, 9, 9, 9]}

編集 2012/02/09:私は Python で本当に困っています。Lev Levitsky の回答で示されたコードは私には機能しません。

>>> a = [1,2,3]
>>> b = [5,7,9]
>>> expandgrid(a, b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in expandgrid
NameError: global name 'itertools' is not defined

ただし、itertoolsモジュールはインストールされているようです(入力してもfrom itertools import *エラーメッセージは返されません)

ベストアンサー1

リストの内包表記を使用するだけです:

>>> [(x, y) for x in range(5) for y in range(5)]

[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4)]

必要に応じてnumpy配列に変換します。

>>> import numpy as np
>>> x = np.array([(x, y) for x in range(5) for y in range(5)])
>>> x.shape
(25, 2)

10000 x 10000 までテストしましたが、Python のパフォーマンスは R の expand.grid のパフォーマンスに匹敵します。タプル (x, y) を使用すると、理解においてリスト [x, y] を使用するよりも約 40% 高速になります。

または...

np.meshgrid を使用すると約 3 倍高速になり、メモリ使用量も大幅に削減されます。

%timeit np.array(np.meshgrid(range(10000), range(10000))).reshape(2, 100000000).T
1 loops, best of 3: 736 ms per loop

Rの場合:

> system.time(expand.grid(1:10000, 1:10000))
   user  system elapsed 
  1.991   0.416   2.424 

R の配列は 1 から始まりますが、Python の配列は 0 から始まります。

おすすめ記事