python update Von ND zu 1D-Arrays




python plot beschriftung (2)

Angenommen, ich habe ein Array a :

a = np.array([[1,2,3], [4,5,6]])

array([[1, 2, 3],
       [4, 5, 6]])

Ich möchte es in ein 1D-Array (dh einen Spaltenvektor) konvertieren:

b = np.reshape(a, (1,np.product(a.shape)))

aber das kehrt zurück

array([[1, 2, 3, 4, 5, 6]])

Das ist nicht das Gleiche wie:

array([1, 2, 3, 4, 5, 6])

Ich kann das erste Element dieses Arrays verwenden, um es manuell in ein 1D-Array umzuwandeln:

b = np.reshape(a, (1,np.product(a.shape)))[0]

aber das erfordert, dass ich weiß, wie viele Dimensionen das ursprüngliche Array hat (und verketten Sie [0] 's, wenn Sie mit höheren Dimensionen arbeiten).

Gibt es eine dimensionsunabhängige Möglichkeit, einen Spalten- / Zeilenvektor aus einem beliebigen ND-Array zu erhalten?


In [14]: b = np.reshape(a, (np.product(a.shape),))

In [15]: b
Out[15]: array([1, 2, 3, 4, 5, 6])

oder einfach:

In [16]: a.flatten()
Out[16]: array([1, 2, 3, 4, 5, 6])

Verwenden Sie np.ravel (für eine 1D-Ansicht) oder np.flatten (für eine 1D-Kopie) oder np.flat (für einen 1D-Iterator):

In [12]: a = np.array([[1,2,3], [4,5,6]])

In [13]: b = a.ravel()

In [14]: b
Out[14]: array([1, 2, 3, 4, 5, 6])

Beachten Sie, dass ravel() wenn möglich, eine view von a zurückgibt. Modifizieren von b ändert also auch a . ravel() gibt eine view wenn die 1D-Elemente zusammenhängend im Speicher sind, würde aber eine copy wenn z. B. a Slicing eines anderen Arrays mit einer Nicht-Einheitsschrittgröße erstellt wurde (z. B. a = x[::2] ) .

Wenn Sie eine Kopie und nicht eine Ansicht wünschen, verwenden Sie

In [15]: c = a.flatten()

Wenn Sie nur einen Iterator wünschen, verwenden Sie np.flat :

In [20]: d = a.flat

In [21]: d
Out[21]: <numpy.flatiter object at 0x8ec2068>

In [22]: list(d)
Out[22]: [1, 2, 3, 4, 5, 6]




numpy