Skip to content

NumPy: Entfernen von Dimensionen der Größe 1 aus ndarray (np.squeeze)

Python

Sie können numpy.squeeze() verwenden, um alle Dimensionen der Größe 1 aus dem NumPy-Array ndarray zu entfernen. Auch Squeeze() wird als Methode von ndarray bereitgestellt.

Dieser Artikel hat folgenden Inhalt.

  • Grundlegende Verwendung von numpy.squeeze()
  • Geben Sie die zu löschende Dimension an:axis
  • numpy.ndarray.squeeze()

Verwenden Sie numpy.reshape(), um in eine beliebige Form zu konvertieren, und numpy.newaxis, numpy.expand_dims(), um eine neue Dimension der Größe 1 hinzuzufügen. Weitere Informationen finden Sie im folgenden Artikel.

Grundlegende Verwendung von numpy.squeeze()

Die Angabe von numpy.ndarray als erstes Argument von numpy.squeeze() gibt numpy.ndarray zurück, wobei alle Dimensionen der Größe 1 entfernt wurden.

import numpy as np

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

print(a.shape)
# (1, 2, 1, 3, 1)

a_s = np.squeeze(a)
print(a_s)
# [[0 1 2]
#  [3 4 5]]

print(a_s.shape)
# (2, 3)

numpy.squeeze() gibt eine Ansicht des ursprünglichen numpy.ndarray zurück. Das ursprüngliche Objekt und das Ansichtsobjekt teilen sich den Speicher, sodass das Ändern eines Elements das andere ändert.

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

Wenn SIE Eine Kopie erstellen möchten, verwenden SIE copy().

a_s_copy = np.squeeze(a).copy()

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

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

Geben Sie die zu löschende Dimension an:axis

Standardmäßig werden alle Bemaßungen mit Größe 1 entfernt, wie im obigen Beispiel.

Sie können den Index der zu entfernenden Dimension in der zweiten Argumentachse von numpy.squeeze() angeben. Dimensionen, die nicht dem angegebenen Index entsprechen, werden nicht entfernt.

print(a.shape)
# (1, 2, 1, 3, 1)
print(np.squeeze(a, 0))
# [[[[0]
#    [1]
#    [2]]]
# 
# 
#  [[[3]
#    [4]
#    [5]]]]

print(np.squeeze(a, 0).shape)
# (2, 1, 3, 1)

Ein Fehler tritt auf, wenn SIE eine Dimension angeben, deren Größe nicht 1 ist, oder eine Dimension, die nicht vorhanden ist.

# print(np.squeeze(a, 1))
# ValueError: cannot select an axis to squeeze out which has size not equal to one

# print(np.squeeze(a, 5))
# AxisError: axis 5 is out of bounds for array of dimension 5

Achse kann auch als negativer Wert angegeben werden. -1 entspricht der letzten Dimension und kann durch die Position von hinten angegeben werden.

print(np.squeeze(a, -1))
# [[[[0 1 2]]
# 
#   [[3 4 5]]]]

print(np.squeeze(a, -1).shape)
# (1, 2, 1, 3)

print(np.squeeze(a, -3))
# [[[[0]
#    [1]
#    [2]]
# 
#   [[3]
#    [4]
#    [5]]]]

print(np.squeeze(a, -3).shape)
# (1, 2, 3, 1)

Sie können mehrere Dimensionen mit Tupeln angeben. Ein Fehler tritt auf, wenn eine Dimension enthalten ist, deren Größe nicht 1 ist oder die nicht vorhanden ist.

print(np.squeeze(a, (0, -1)))
# [[[0 1 2]]
# 
#  [[3 4 5]]]

print(np.squeeze(a, (0, -1)).shape)
# (2, 1, 3)

# print(np.squeeze(a, (0, 1)))
# ValueError: cannot select an axis to squeeze out which has size not equal to one

numpy.ndarray.squeeze()

Auch Squeeze() wird als Methode von numpy.ndarray bereitgestellt.

Die Verwendung ist die gleiche wie bei numpy.squeeze(). Das erste Argument ist Achse.

print(a.squeeze())
# [[0 1 2]
#  [3 4 5]]

print(a.squeeze().shape)
# (2, 3)

print(a.squeeze((0, -1)))
# [[[0 1 2]]
# 
#  [[3 4 5]]]

print(a.squeeze((0, -1)).shape)
# (2, 1, 3)

Die Methode Squeeze() gibt auch eine Ansicht wie numpy.squeeze() zurück. Das ursprüngliche Objekt bleibt gleich.

a_s = a.squeeze()
print(a_s)
# [[0 1 2]
#  [3 4 5]]

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

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