2017-03-14 6 views
1

私はいくつかの簡単な質問がありますが、答えを見つけることができません。それらは、次の例のコードで両方とも記述されています。何か助けてくれてありがとう!多次元要素を形状変更せずにnumpy配列に追加する

import numpy as np 
#here are two arrays to join together 
a = np.array([1,2,3,4,5]) 
b = np.array([6,7,8,9,10]) 
#here comes the joining step I don't know how to do better 

#QUESTION 1: How to form all permutations of two 1D arrays? 

temp = np.array([]) #empty array to be filled with values 
for aa in a: 
    for bb in b: 
     temp = np.append(temp,[aa,bb]) #fill the array 

#QUESTION 2: Why do I have to reshape? How can I avoid this? 

temp = temp.reshape((int(temp.size/2),2)) 

編集:作られたコードより最小限

+0

したがって、すべての順列を形成するという目的を達成するためのあなたのルーパートはありませんか? – Divakar

+0

はい、確かにこれを行うにはクリーンな方法がありますか?私はnumpyで配列をループするのを避けようとしています。使用できるnp.zip()のようなアプリケーションがありますか? – kevinkayaks

答えて

1

繰り返し配列を構築するための適切な方法は、リストはappendです。 np.appendの名前が不十分で、しばしば誤って使用されます。

In [274]: a = np.array([1,2,3,4,5]) 
    ...: b = np.array([6,7,8,9,10]) 
    ...: 
In [275]: temp = [] 
In [276]: for aa in a: 
    ...:  for bb in b: 
    ...:   temp.append([aa,bb]) 
    ...:   
In [277]: temp 
Out[277]: 
[[1, 6], 
[1, 7], 
[1, 8], 
[1, 9], 
[1, 10], 
[2, 6], 
    .... 
[5, 9], 
[5, 10]] 
In [278]: np.array(temp).shape 
Out[278]: (25, 2) 

ループを避けることをお勧めしますが、必要があれば、このリストの追加アプローチを使用してください。

4

あなたの最初の質問に答えるために、あなたは、2つの入力配列の要素の間に、それらの組み合わせを形成し、ベクトル化方法でtempの最終版を取得するnp.meshgridを使用することができますそのように、これらのループを回避 - あなたは2列の出力配列を取得する場合

見られるように
np.array(np.meshgrid(a,b)).transpose(2,1,0).reshape(-1,2) 

が、我々はまだリシェイプが必要になります。


他の方法でメッシュ構造体を構築し、再構成を避けることができます。以下に示すように、np.column_stackとなり、これらの方法の一つ -

r,c = np.meshgrid(a,b) 
temp = np.column_stack((r.ravel('F'), c.ravel('F'))) 
+0

ありがとうございますDivakar--これでコード例を編集しましたが、これは今読むべきです np.array(np.meshgrid(a、b))。transpose(2,1,0).reshape(-1,2) – kevinkayaks

+0

@ kevinkayaksクリーンアップを気に入ってください!それに応じて私のコードを編集しました。 – Divakar

関連する問題