Gibt es eine mehrdimensionale Version von arange / linspace in numpy?

79

Ich möchte eine Liste von 2d NumPy-Arrays (x, y), wobei jedes x in {-5, -4,5, -4, -3,5, ..., 3,5, 4, 4,5, 5} und dasselbe für y steht .

ich könnte

x = np.arange(-5, 5.1, 0.5)
y = np.arange(-5, 5.1, 0.5)

und dann alle möglichen Paare durchlaufen, aber ich bin sicher, es gibt einen schöneren Weg ...

Ich möchte etwas zurück, das aussieht wie:

[[-5, -5],
 [-5, -4.5],
 [-5, -4],
 ...
 [5, 5]]

aber die Reihenfolge spielt keine Rolle.

Hilemonstoer
quelle
1
Hast du eine Frage? Edit: Ich sehe die Fragexy = np.matrix([x, y])
Andy Kubiak
Dies verkettet nur die beiden Arrays.
Hilemonstoer
1
Ich bin ein bisschen verwirrt, das "Ich möchte etwas zurück, das aussieht wie:" und "wo jedes x in {-5, -4,5, -4, -3,5, ..., 3,5, 4, 4,5, 5} steht. und das gleiche für y "scheint nicht zu passen.
Ciro Santilli 3 冠状 病 六四 事件 3

Antworten:

74

Sie können np.mgriddies verwenden, es ist oft bequemer als np.meshgridweil es die Arrays in einem Schritt erstellt:

import numpy as np
X,Y = np.mgrid[-5:5.1:0.5, -5:5.1:0.5]

Ersetzen Sie für linspaceähnliche Funktionen den Schritt (dh 0.5) durch eine komplexe Zahl, deren Größe die Anzahl der Punkte angibt, die Sie in der Reihe haben möchten. Mit dieser Syntax werden dieselben Arrays wie oben angegeben:

X, Y = np.mgrid[-5:5:21j, -5:5:21j]

Sie können Ihre Paare dann wie folgt erstellen:

xy = np.vstack((X.flatten(), Y.flatten())).T

Wie von @ali_m vorgeschlagen, kann dies alles in einer Zeile erfolgen:

xy = np.mgrid[-5:5.1:0.5, -5:5.1:0.5].reshape(2,-1).T

Viel Glück!

farenorth
quelle
15
... oder als xy = np.mgrid[-5:5.1:0.5, -5:5.1:0.5].reshape(2, -1).T
Einzeiler
20

Dies ist genau das, wonach Sie suchen:

matr = np.linspace((1,2),(10,20),10)

Das heisst:

Für die erste Spalte; Setzen Sie von 1 von (1,2) bis 10 von (10,20) die steigenden 10 Zahlen.

Für die zweite Spalte; Setzen Sie von 2 von (1,2) bis 20 von (10,20) die steigenden 10 Zahlen.

Und das Ergebnis wird sein:

[[ 1.  2.]
 [ 2.  4.]
 [ 3.  6.]
 [ 4.  8.]
 [ 5. 10.]
 [ 6. 12.]
 [ 7. 14.]
 [ 8. 16.]
 [ 9. 18.]
 [10. 20.]]

Sie können auch die Werte einer Spalte erhöhen, wenn Sie beispielsweise Folgendes sagen:

matr = np.linspace((1,2),(1,20),10)

Die erste Spalte wird 10 Mal von 1 von (1,2) bis 1 von (1,20) sein, was bedeutet, dass sie als 1 bleibt und das Ergebnis lautet:

[[ 1.  2.]
 [ 1.  4.]
 [ 1.  6.]
 [ 1.  8.]
 [ 1. 10.]
 [ 1. 12.]
 [ 1. 14.]
 [ 1. 16.]
 [ 1. 18.]
 [ 1. 20.]]
Fırat Korkmaz
quelle
In numpy-Versionen vor 1.16 wird dies einen Fehler auslösen. siehe stackoverflow.com/questions/57269217/…
Techniquab
Dies ist nicht zweidimensional.
Oulenz
funktioniert auch mit Listen als Eingaben! Großartig als Vorverarbeitungsschritt für Meshgrid
Yuri Feldman
13

Ich denke du willst np.meshgrid:

Koordinatenmatrizen von Koordinatenvektoren zurückgeben.

Erstellen Sie ND-Koordinatenarrays für vektorisierte Auswertungen von ND-Skalar- / Vektorfeldern über ND-Gittern mit gegebenen eindimensionalen Koordinatenarrays x1, x2, ..., xn.

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)

Sie können dies mit in Ihre gewünschte Ausgabe konvertieren

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. ]])
tmdavison
quelle
Dies gibt zwei große Matrizen zurück, von denen ich denke, dass ich sie noch durchlaufen müsste, um meine gewünschte Matrix von Paaren zu erhalten. Liege ich falsch?
Hilemonstoer
Siehe meine Bearbeitung: Sie können es ziemlich einfach ohne Iteration in Ihr gewünschtes Array konvertieren
tmdavison
Iteration ist in numpy fast nie erforderlich;)
OrangeSherbet
6

Wenn Sie nur Paare durchlaufen möchten (und nicht alle Punkte gleichzeitig berechnen möchten), sollten Sie am besten itertools.productalle möglichen Paare durchlaufen:

import itertools

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

Dies vermeidet die Erzeugung großer Matrizen über meshgrid.

chthonicdaemon
quelle
5

Wir können die Arrangierfunktion verwenden als:

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]]
Pranav Joshi
quelle
np.array(np.arange(?
CristiFati
Dies ist nicht zweidimensional.
Oulenz
1

Ich bin mir nicht sicher, ob ich die Frage verstehe - um eine Liste von NumPy-Arrays mit zwei Elementen zu erstellen, funktioniert dies:

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 gibt Ihnen eine Liste von Tupeln, und das Listenverständnis erledigt den Rest.

uhoh
quelle
0

Es ist keine superschnelle Lösung, funktioniert aber für jede Dimension

import numpy as np
def linspace_md(v_min,v_max,dim,num):
    output = np.empty( (num**dim,dim)  )
    values = np.linspace(v_min,v_max,num)
    for i in range(output.shape[0]):
        for d in range(dim):
            output[i][d] = values[( i//(dim**d) )%num]
    return output
cb1986ster
quelle
0

Ich habe es immer noch mit Linspace gemacht, weil ich mich lieber an diesen Befehl halte.

Sie können wie folgt formatieren: np.linspace (np.zeros ( Breite ) [0], np.full ((1, Breite ), - 1) [0], Höhe )

np.linspace(np.zeros(5)[0],np.full((1,5),-1)[0],5)

Geben Sie Folgendes aus:

array([[ 0.  ,  0.  ,  0.  ,  0.  ,  0.  ],
       [-0.25, -0.25, -0.25, -0.25, -0.25],
       [-0.5 , -0.5 , -0.5 , -0.5 , -0.5 ],
       [-0.75, -0.75, -0.75, -0.75, -0.75],
       [-1.  , -1.  , -1.  , -1.  , -1.  ]])

Fügen Sie .tranpose () hinzu, dann erhalten Sie:

array([[ 0.  , -0.25, -0.5 , -0.75, -1.  ],
      [ 0.  , -0.25, -0.5 , -0.75, -1.  ],
      [ 0.  , -0.25, -0.5 , -0.75, -1.  ],
      [ 0.  , -0.25, -0.5 , -0.75, -1.  ],
      [ 0.  , -0.25, -0.5 , -0.75, -1.  ]])
momo668
quelle
-1

Anhand dieses Beispiels können Sie jede gewünschte Dimmung vornehmen

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