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 から始まります。