Skip to content

NumPy: Wie man reshape() verwendet und was -1 bedeutet

Python

Verwenden Sie zum Konvertieren der Form eines NumPy-Arrays ndarray die Methode reshape() von ndarray oder die Funktion numpy.reshape().

Dieser Artikel hat folgenden Inhalt.

  • Also verwenden Sie die Methode ndarray.reshape()
  • So verwenden Sie die Funktion numpy.reshape()
  • Konvertierungsauftrag:order
  • Die Bedeutung von -1 in reshape()
  • reshape() gibt die Ansicht zurück

Wenn SIE die Form oder die Anzahl der Dimensionen von ndarray überprüfen möchten, lesen Sie den following Artikel.

Sie können reshape() verwenden, um in eine beliebige Form zu konvertieren, aber bei bestimmten Formkonvertierungen stehen möglicherweise Alternativen zur Verfügung.

Außerdem WIRD im Betrieb zwischen NumPy-Arrays (ndarray) jede Form automatisch durch Senden in dieselbe umgewandelt.

Also verwenden Sie die Methode ndarray.reshape()

Nehmen Sie als Beispiel das folgende eindimensionale NumPy-Array ndarray.

import numpy as np

a = np.arange(24)

print(a)
# [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]

print(a.shape)
# (24,)

print(a.ndim)
# 1

Geben Sie die Form als Liste oder Tupel im ersten Argument der Methode reshape() von numpy.ndarray an.

a_4_6 = a.reshape([4, 6])

print(a_4_6)
# [[ 0  1  2  3  4  5]
#  [ 6  7  8  9 10 11]
#  [12 13 14 15 16 17]
#  [18 19 20 21 22 23]]

print(a_4_6.shape)
# (4, 6)

print(a_4_6.ndim)
# 2
a_2_3_4 = a.reshape([2, 3, 4])

print(a_2_3_4)
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]
# 
#  [[12 13 14 15]
#   [16 17 18 19]
#   [20 21 22 23]]]

print(a_2_3_4.shape)
# (2, 3, 4)

print(a_2_3_4.ndim)
# 3

Wenn die Form nicht mit der Anzahl der Elemente im ursprünglichen Array zu sehen ist, tritt ValueError auf.

# a_5_6 = a.reshape([5, 6])
# ValueError: cannot reshape array of size 24 into shape (5,6)

Sie können jeden Dimensionswert der Reihe nach angeben, nicht eine Liste oder ein Tupel.

print(a.reshape(4, 6))
# [[ 0  1  2  3  4  5]
#  [ 6  7  8  9 10 11]
#  [12 13 14 15 16 17]
#  [18 19 20 21 22 23]]

print(a.reshape(2, 3, 4))
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]
# 
#  [[12 13 14 15]
#   [16 17 18 19]
#   [20 21 22 23]]]

So verwenden Sie die Funktion numpy.reshape()

Geben Sie in der Funktion numpy.reshape() die ursprüngliche numpy.ndarray als erstes Argument und die Form für das zweite Argument als Liste oder Tupel an. Wenn die Form nicht mit der Anzahl der Elemente im ursprünglichen Array zu sehen ist, tritt ValueError auf.

print(np.reshape(a, [4, 6]))
# [[ 0  1  2  3  4  5]
#  [ 6  7  8  9 10 11]
#  [12 13 14 15 16 17]
#  [18 19 20 21 22 23]]

print(np.reshape(a, [2, 3, 4]))
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]
# 
#  [[12 13 14 15]
#   [16 17 18 19]
#   [20 21 22 23]]]

# print(np.reshape(a, [5, 6]))
# ValueError: cannot reshape array of size 24 into shape (5,6)

Das zweite Argument der Funktion numpy.reshape() muss eine Liste oder ein Tupel sein. Wenn Sie nacheinander den Wert jeder Dimension angeben, wie die Methode reshape() von numpy.ndarray, wird ValueError ausgelöst.

print(a.reshape(4, 6))
# [[ 0  1  2  3  4  5]
#  [ 6  7  8  9 10 11]
#  [12 13 14 15 16 17]
#  [18 19 20 21 22 23]]

# print(np.reshape(a, 4, 6))
# ValueError: cannot reshape array of size 24 into shape (4,)

Konvertierungsauftrag:order

Die Konvertierungsreihenfolge kann mit dem Argument order angegeben werden. order=“C“(default) bedeutet C-ähnliche Indexreihenfolge, order=“F“ bedeutet Fortran-ähnliche Indexreihenfolge.

Die Ergebnisse unterscheiden sich wie folgt.

print(a.reshape([4, 6], order='C'))
# [[ 0  1  2  3  4  5]
#  [ 6  7  8  9 10 11]
#  [12 13 14 15 16 17]
#  [18 19 20 21 22 23]]

print(a.reshape([4, 6], order='F'))
# [[ 0  4  8 12 16 20]
#  [ 1  5  9 13 17 21]
#  [ 2  6 10 14 18 22]
#  [ 3  7 11 15 19 23]]

print(a.reshape([2, 3, 4], order='C'))
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]
# 
#  [[12 13 14 15]
#   [16 17 18 19]
#   [20 21 22 23]]]

print(a.reshape([2, 3, 4], order='F'))
# [[[ 0  6 12 18]
#   [ 2  8 14 20]
#   [ 4 10 16 22]]
# 
#  [[ 1  7 13 19]
#   [ 3  9 15 21]
#   [ 5 11 17 23]]]

Gleiches gilt für die Funktion numpy.reshape():

print(np.reshape(a, [4, 6], order='F'))
# [[ 0  4  8 12 16 20]
#  [ 1  5  9 13 17 21]
#  [ 2  6 10 14 18 22]
#  [ 3  7 11 15 19 23]]

Mit der Methode reshape() von numpy.ndarray können SIE die Form jeder Dimension der Reihe nach wie oben angeben. Wenn Sie auch die Argumentreihenfolge angeben, müssen Sie das Schlüsselwort verwenden.

In der Funktion numpy.reshape() ist das dritte Argument immer um, daher kann das Schlüsselwort weggelassen werden.

# print(a.reshape([4, 6], 'F'))
# TypeError: 'list' object cannot be interpreted as an integer

print(np.reshape(a, [4, 6], 'F'))
# [[ 0  4  8 12 16 20]
#  [ 1  5  9 13 17 21]
#  [ 2  6 10 14 18 22]
#  [ 3  7 11 15 19 23]]

Die Bedeutung von -1 in reshape()

Sie können -1 verwenden, um die Form in reshape() anzugeben.

Nehmen Sie als Beispiel die Methode reshape() von numpy.ndarray, aber dasselbe gilt für die Funktion numpy.reshape().

Die Länge der auf -1 gesetzten Bemaßung wird automatisch bestimmt, abhängig von den angegebenen Werten anderer Bemaßungen wird übertragen. Dies ist nützlich, wenn Sie eine große Array-Form konvertieren.

print(a.reshape([4, -1]))
# [[ 0  1  2  3  4  5]
#  [ 6  7  8  9 10 11]
#  [12 13 14 15 16 17]
#  [18 19 20 21 22 23]]

print(a.reshape([2, -1, 4]))
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]
# 
#  [[12 13 14 15]
#   [16 17 18 19]
#   [20 21 22 23]]]

Sie können -1 nur für eine Dimension verwenden. Bei Verwendung für mehr als eine Dimension tritt ValueError auf.

# print(a.reshape([2, -1, -1]))
# ValueError: can only specify one unknown dimension

Wenn kein Wert die Bedingung erfüllt ist, wird ValueError ausgelöst.

# print(a.reshape([2, -1, 5]))
# ValueError: cannot reshape array of size 24 into shape (2,newaxis,5)

reshape() gibt die Ansicht zurück

Beachten Sie, dass sowohl die Methode reshape() von numpy.ndarray als auch die Funktion numpy.reshape() wann immer möglich eine Ansicht anstelle einer Kopie zurückgeben. Da es „so viel wie möglich“ ist, kann je nach Speicherauslegung statt einer Ansicht eine Kopie zurückerstattet werden.

Siehe den following Artikel für Ansichten und Kopien in NumPy.

Das folgende Beispiel verwendet die reshape()-Methode von numpy.ndarray, aber dasselbe gilt für die numpy.reshape()-Funktion.

reshape() gibt eine Ansicht zurück und teilt den Speicher mit der ursprünglichen numpy.ndarray.

a = np.arange(8)
print(a)
# [0 1 2 3 4 5 6 7]

a_2_4 = a.reshape([2, 4])
print(a_2_4)
# [[0 1 2 3]
#  [4 5 6 7]]

print(np.shares_memory(a, a_2_4))
# True

Das Ändern des ursprünglichen Objekts ändert das von reshape() zurückgegebene Ansichtsobjekt wie folgt:

a[0] = 100
print(a)
# [100   1   2   3   4   5   6   7]

print(a_2_4)
# [[100   1   2   3]
#  [  4   5   6   7]]

Gleiches gilt für den umgekehrten Fall. Das Ändern des von reshape() zurückgegebenen Ansichtsobjekts ändert das ursprüngliche Objekt.

a_2_4[0, 0] = 0
print(a_2_4)
# [[0 1 2 3]
#  [4 5 6 7]]

print(a)
# [0 1 2 3 4 5 6 7]

If SIE Eine Kopie erhalten möchten, verwenden SIE sterben Methode copy(). In diesem Fall wirkt sich das Ändern der einzelnen Objekte nicht auf das andere Objekt aus.

a_2_4_copy = a.reshape([2, 4]).copy()
print(a_2_4_copy)
# [[0 1 2 3]
#  [4 5 6 7]]

print(np.shares_memory(a, a_2_4_copy))
# False

a[0] = 100
print(a)
# [100   1   2   3   4   5   6   7]

print(a_2_4_copy)
# [[0 1 2 3]
#  [4 5 6 7]]

a_2_4_copy[0, 0] = 200
print(a_2_4_copy)
# [[200   1   2   3]
#  [  4   5   6   7]]

print(a)
# [100   1   2   3   4   5   6   7]

Das Folgende ist ein Beispiel, bei dem reshape() eine Kopie anstelle einer Ansicht zurückgibt:

Wenn der Schritt im Speicher als Ergebnis der Transformation eines Schritt-spezifischen Slice nicht konstant ist, wird eine Kopie zurückgegeben.

a = np.arange(6).reshape(2, 3)
print(a)
# [[0 1 2]
#  [3 4 5]]

a_step = a[:, ::2]
print(a_step)
# [[0 2]
#  [3 5]]

print(a_step.reshape(-1))
# [0 2 3 5]

print(np.shares_memory(a_step, a_step.reshape(-1)))
# False

Bei einem schrittspezifischen Slice wird eine Ansicht zurückgegeben, wenn die Schrittweite konstant ist.

a = np.arange(8).reshape(2, 4)
print(a)
# [[0 1 2 3]
#  [4 5 6 7]]

a_step = a[:, ::2]
print(a_step)
# [[0 2]
#  [4 6]]

print(a_step.reshape(-1))
# [0 2 4 6]

print(np.shares_memory(a_step, a_step.reshape(-1)))
# True