web-dev-qa-db-ja.com

numpyにはarange / linspaceの多次元バージョンがありますか?

各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]]

しかし、順序は関係ありません。

47
Hilemonstoer

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

幸運を祈ります!

50
farenorth

あなたが欲しいと思う 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. ]])
9
tmdavison

これはまさにあなたが探しているものです:

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.]]
3
Fırat Korkmaz

アレンジ機能は次のように使用できます。

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]]
3
Pranav Joshi

ペアを繰り返し処理するだけの場合(ポイントのセット全体を一度に計算しない場合)、itertools.product可能なすべてのペアを反復処理します。

import itertools

for (xi, yi) in itertools.product(x, y):
    print(xi, yi)

これにより、meshgridを介した大きな行列の生成が回避されます。

2
chthonicdaemon

この例に基づいて、任意の薄暗いものを作成できます

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
0
Martin

私が質問を理解しているかどうかはわかりません-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はタプルのリストを提供し、リスト内包表記が残りを行います。

0
uhoh