it-swarm.com.de

Was macht Numpy Ndarray Shape?

Ich habe eine einfache Frage zur .shape-Funktion, die mich sehr verwirrt hat.

a = np.array([1, 2, 3])   # Create a rank 1 array
print(type(a))            # Prints "<class 'numpy.ndarray'>"
print(a.shape)            # Prints "(3,)"

b = np.array([[1,2,3],[4,5,6]])    # Create a rank 2 array
print(b.shape)                     # Prints "(2, 3)"

Was genau hat die .shape getan? Zählen Sie, wie viele Zeilen, wie viele Spalten, und nehmen Sie dann an, (1,3), eine Zeile, drei Spalten, oder?

24
Pumpkin C

_yourarray.shape_ oder np.shape() oder np.ma.shape() gibt die Form Ihres ndarray als Tuple zurück; Und Sie können die (Anzahl von) Dimensionen Ihres Arrays mit _yourarray.ndim_ oder np.ndim() ermitteln. (d. h. es gibt den n des ndarray an, da alle Arrays in NumPy nur n-dimensionale Arrays sind (kurz als ndarrays bezeichnet).

Für ein Array 1D wäre die Form _(n,)_, wobei n die Anzahl der Elemente in Ihrem Array ist.

Für ein 2D Array wäre die Form _(n,m)_, wobei n die Anzahl der Zeilen und m die Anzahl der Spalten in Ihrem Array ist .

Bitte beachten Sie, dass in 1D Fällen die Form einfach _(n, )_ anstelle dessen ist, was Sie als _(1, n)_ oder _(n, 1)_ für Zeilen- und Spaltenvektoren.

Dies folgt der Konvention, dass:

Geben Sie für 1D-Arrays ein Form Tuple mit nur 1 Element zurück (d. H. _(n,)_)
Für ein 2D-Array geben Sie ein shape Tuple mit nur 2 Elementen zurück (d. H. _(n,m)_)
Für ein 3D-Array geben Sie ein shape Tuple mit nur 3 Elementen zurück (d. H. _(n,m,k)_)
Für 4D-Arrays geben Sie ein shape Tuple mit nur 4 Elementen zurück (d. H. _(n,m,k,j)_)

und so weiter.

Beachten Sie auch das folgende Beispiel, um zu sehen, wie sich np.shape() oder np.ma.shape() mit 1D Verhält = Arrays und Skalare:

_# sample array
In [10]: u = np.arange(10)

# get its shape
In [11]: np.shape(u)    # u.shape
Out[11]: (10,)

# get array dimension using `np.ndim`
In [12]: np.ndim(u)
Out[12]: 1

In [13]: np.shape(np.mean(u))
Out[13]: ()       # empty Tuple (to indicate that a scalar is a 0D array).

# check using `numpy.ndim`
In [14]: np.ndim(np.mean(u))
Out[14]: 0
_

PS : Also, die Form Tupel ist konsistent mit unserem Verständnis von Dimensionen Raum, zumindest mathematisch.

39
kmario23

Anders als der beliebteste kommerzielle Konkurrent handelt es sich bei Numpy von Anfang an um "beliebig dimensionale" Arrays. Deshalb heißt die Kernklasse ndarray. Sie können die Dimensionalität eines Numpy-Arrays mit der Eigenschaft .ndim Überprüfen. Die Eigenschaft .shape Ist ein Tupel mit der Länge .ndim, Das die Länge der einzelnen Dimensionen enthält. Derzeit kann numpy bis zu 32 Dimensionen verarbeiten:

a = np.ones(32*(1,))
a
# array([[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ 1.]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]])
a.shape
# (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
a.ndim
# 32

Wenn ein numpy-Array wie in Ihrem zweiten Beispiel 2d ist, sollten Sie es in Zeilen und Spalten betrachten. Aber ein 1d-Array in Numpy ist wirklich 1d, keine Zeilen oder Spalten.

Wenn Sie so etwas wie einen Zeilen- oder Spaltenvektor möchten, können Sie dies erreichen, indem Sie ein 2D-Array mit einer Dimension von 1 erstellen.

a = np.array([[1,2,3]]) # a 'row vector'
b = np.array([[1],[2],[3]]) # a 'column vector'
# or if you don't want to type so many brackets:
b = np.array([[1,2,3]]).T
3
Paul Panzer