各xが{-5、-4.5、-4、-3.5、...、3.5、4、4.5、5}にあり、yにも同じである2d NumPy配列(x、y)のリストが欲しい。
私はそれをできた
x = np.arange(-5, 5.1, 0.5)
y = np.arange(-5, 5.1, 0.5)
そして、可能なすべてのペアを反復処理しますが、もっと良い方法があると確信しています...
次のようなものを戻したいです。
[[-5, -5],
[-5, -4.5],
[-5, -4],
...
[5, 5]]
しかし、順序は関係ありません。
np.mgrid
このため、 np.meshgrid
は、1ステップで配列を作成するためです。
import numpy as np
X,Y = np.mgrid[-5:5.1:0.5, -5:5.1:0.5]
Linspaceのような機能の場合、ステップを置き換えます(つまり、0.5
) 複素数 で、その大きさは系列に必要なポイントの数を指定します。この構文を使用すると、上記と同じ配列が次のように指定されます。
X, Y = np.mgrid[-5:5:21j, -5:5:21j]
次に、次のようにペアを作成できます。
xy = np.vstack((X.flatten(), Y.flatten())).T
@ALi_mが示唆したように、これはすべて1行で実行できます。
xy = np.mgrid[-5:5.1:0.5, -5:5.1:0.5].reshape(2,-1).T
幸運を祈ります!
あなたが欲しいと思う np.meshgrid
:
座標ベクトルから座標行列を返します。
1次元座標配列x1、x2、...、xnを指定して、N-Dグリッド上のN-Dスカラー/ベクトルフィールドのベクトル化評価用のN-D座標配列を作成します。
import numpy as np
x = np.arange(-5, 5.1, 0.5)
y = np.arange(-5, 5.1, 0.5)
X,Y = np.meshgrid(x,y)
あなたはそれをあなたの望む出力に変換することができます
XY=np.array([X.flatten(),Y.flatten()]).T
print XY
array([[-5. , -5. ],
[-4.5, -5. ],
[-4. , -5. ],
[-3.5, -5. ],
[-3. , -5. ],
[-2.5, -5. ],
....
[ 3. , 5. ],
[ 3.5, 5. ],
[ 4. , 5. ],
[ 4.5, 5. ],
[ 5. , 5. ]])
これはまさにあなたが探しているものです:
matr = np.linspace((1,2),(10,20),10)
これの意味は:
最初の列。 (1,2)の1から(10,20)の10まで、増加する10の数字を置きます。
2列目。 (1,2)の2から(10,20)の20まで、増加する10の数字を入れます。
結果は次のようになります。
[[ 1. 2.]
[ 2. 4.]
[ 3. 6.]
[ 4. 8.]
[ 5. 10.]
[ 6. 12.]
[ 7. 14.]
[ 8. 16.]
[ 9. 18.]
[10. 20.]]
たとえば、次のように言うと、1つの列の値のみを増加させ続けることもできます。
matr = np.linspace((1,2),(1,20),10)
最初の列は、(1,2)の1から(1,20)の1までの10回です。つまり、1のままで、結果は次のようになります。
[[ 1. 2.]
[ 1. 4.]
[ 1. 6.]
[ 1. 8.]
[ 1. 10.]
[ 1. 12.]
[ 1. 14.]
[ 1. 16.]
[ 1. 18.]
[ 1. 20.]]
アレンジ機能は次のように使用できます。
z1 = np.array([np.array(np.arange(1,5)),np.array(np.arange(1,5))])
print(z1)
o/p=> [[1 2 3 4]
[1 2 3 4]]
ペアを繰り返し処理するだけの場合(ポイントのセット全体を一度に計算しない場合)、itertools.product
可能なすべてのペアを反復処理します。
import itertools
for (xi, yi) in itertools.product(x, y):
print(xi, yi)
これにより、meshgrid
を介した大きな行列の生成が回避されます。
この例に基づいて、任意の薄暗いものを作成できます
def linspace3D(point1,point2,length):
v1 = np.linspace(point1[0],point2[0],length)
v2 = np.linspace(point1[1],point2[1],length)
v3 = np.linspace(point1[2],point2[2],length)
line = np.zeros(shape=[length,3])
line[:,0]=v1
line[:,1]=v2
line[:,2]=v3
return line
私が質問を理解しているかどうかはわかりません-2-element NumPy配列のリストを作成するには、これは動作します:
import numpy as np
x = np.arange(-5, 5.1, 0.5)
X, Y = np.meshgrid(x, x)
Liszt = [np.array(thing) for thing in Zip(X.flatten(), Y.flatten())] # for python 2.7
Zip
はタプルのリストを提供し、リスト内包表記が残りを行います。