2017-01-05 19 views
3

numert配列を作成するためにitertoolsのさまざまな関数を使いたいと思います。私は、製品、組み合わせ、順列などの要素の数を事前に計算することができますので、割り振るスペースは問題にならないはずです。itertoolsとnumpyの配列

coords = [[1,2,3],[4,5,6]] 
iterable = itertools.product(*coords) 
shape = (len(coords[0]), len(coords[1])) 
arr = np.iterable_to_array(
    iterable, 
    shape=shape, 
    dtype=np.float64, 
    count=shape[0]*shape[1] 
) #not a real thing 
answer = np.array([ 
    [1,4],[1,5],[1,6], 
    [2,4],[2,5],[2,6], 
    [3,4],[3,5],[3,6]]) 
assert np.equal(arr, answer) 
+2

ので、使用してそれらを結合する方法を発見し、理由がありますが 'ARR = np.array(リスト(反復可能) ) 'あなたのために働かないのですか?あなたはおそらく 'np.formiter'を探していますが、多次元配列をうまく扱うことはできません。最後に試しました。 –

+0

また、ゼロの配列を作成し、個々の値を入力することもできます。それは速くて、おそらく:http://forthescience.org/blog/2015/06/07/performance-of-filling-a-numpy-array/... numpyを持つ良い方法があったかどうか疑問に思っていたiterablesはPythonのどこにでもポップアップするので、作業をしてください。 – Scott

+1

残念ながら、AFAIKはiterablesから1次元配列を構築するためのサポートしかありません。この交換をチェックしてください:https://mail.scipy.org/pipermail/numpy-discussion/2007-August/028898.html 確かに、彼らは '空'を使用することを提案します! –

答えて

1

ここ

In [469]: coords = [[1,2,3],[4,5,6]] 
In [470]: it = itertools.product(*coords) 
In [471]: arr = np.array(list(it)) 
In [472]: arr 
Out[472]: 
array([[1, 4], 
     [1, 5], 
     [1, 6], 
     [2, 4], 
     [2, 5], 
     [2, 6], 
     [3, 4], 
     [3, 5], 
     [3, 6]]) 

fromiterは、適切な構造化dtypeで動作します、これらの値を持つ配列を生成するにはいくつかのnumpyの方法があります。

In [473]: it = itertools.product(*coords) 
In [474]: arr = np.fromiter(it, dtype='i,i') 
In [475]: arr 
Out[475]: 
array([(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), 
     (3, 6)], 
     dtype=[('f0', '<i4'), ('f1', '<i4')]) 

は、しかし、通常我々は、ツールを使用しているnumpyシーケンスとメッシュの生成を提供します。 np.arangeはすべての場所で使用されています。

meshgridが広く用いられている。試行錯誤のビットで、私は、私はその出力をトランスポーズ、同じシーケンスを生成できることが分かっ:

In [481]: np.transpose(np.meshgrid(coords[0], coords[1], indexing='ij'), (1,2,0)).reshape(-1,2) 
Out[481]: 
array([[1, 4], 
     [1, 5], 
     [1, 6], 
     [2, 4], 
     [2, 5], 
     [2, 6], 
     [3, 4], 
     [3, 5], 
     [3, 6]]) 

repeattileこのようなタスクのためにも有用である:

In [487]: np.column_stack((np.repeat(coords[0],3), np.tile(coords[1],3))) 
Out[487]: 
array([[1, 4], 
     [1, 5], 
     [1, 6], 
     [2, 4], 
     [2, 5], 
     [2, 6], 
     [3, 4], 
     [3, 5], 
     [3, 6]]) 

私がやりました過去にはfromiterのいくつかのタイミング。私の記憶は、np.array以上の控えめな時間節約しか提供しないということです。

Aが戻っている間、私はitertoolsfromiterを探求し、itertools.chain

convert itertools array into numpy array

In [499]: it = itertools.product(*coords) 
In [500]: arr = np.fromiter(itertools.chain(*it),int).reshape(-1,2) 
In [501]: arr 
Out[501]: 
array([[1, 4], 
     [1, 5], 
     [1, 6], 
     [2, 4], 
     [2, 5], 
     [2, 6], 
     [3, 4], 
     [3, 5], 
     [3, 6]]) 
+0

これは動作しますが、numpyのitertoolsパッケージを書き直す必要はありません。 – Scott

+1

'itertools.chain'を使って' product'を平坦化するという以前の答えが見つかりました。 – hpaulj

+0

それはかなり甘いです。 – Scott

関連する問題