Skip to content

NumPy: Rimuovere le dimensioni di 1 da ndarray (np.squeeze)

Python

È possibile utilizzare numpy.squeeze() per rimuovere tutte le dimensioni di dimensione 1 dall’array NumPy ndarray. squeeze() viene fornito anche come metodo di ndarray.

In questo articolo vengono descritti i seguenti contenuti.

  • Utilizzo di base di numpy.squeeze()
  • Specifica la dimensione da eliminare:axis
  • numpy.ndarray.squeeze()

Usa numpy.reshape() per aggiungere in qualsiasi forma e numpy.newaxis, numpy.expand_dims() per aggiungere una nuova dimensione di articolo dimensione 1. Vedere il seguente articolo per i dettagli.

Utilizzo di base di numpy.squeeze()

Specificando numpy.ndarray come primo argomento di numpy.squeeze() si richiede numpy.ndarray con tutte le dimensioni di dimensione 1 rimosse.

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() restituisce una vista dell’originale numpy.ndarray. L’oggetto originale e l’oggetto di visualizzazione condivide la memoria, quindi la modifica di un elemento cambia l’altro.

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

Se vuoi fare una copia, usa copy().

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

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

Vedere il seguente articolo per recensioni e copie in NumPy.

Specifica la dimensione da eliminare:axis

Per impostazione predefinita, tutte le dimensioni con dimensione 1 vengono rimosse, come nell’esempio sopra.

È possibile specificare l’indice della dimensione da rimuovere nel secondo asse degli argomenti di numpy.squeeze(). Le dimensioni che non sono l’indice specificato non vengono rimosse.

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)

Si verificherà un errore se si specifica una dimensione la cui dimensione non è 1 o una dimensione che non esiste.

# 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

l’asse può anche essere specificato come valore negativo. -1 corrisponde all’ultima dimensione e può essere specificato dalla posizione dal retro.

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)

È possibile specificare più dimensioni con tupla. Si verifica un errore se viene inclusa una dimensione la cui dimensione non è 1 o non esiste.

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()

squeeze() viene fornito anche come metodo di numpy.ndarray.

L’utilizzo è lo stesso di numpy.squeeze(). Il primo argomento è asse.

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)

Il metodo squeeze() contiene anche una vista come numpy.squeeze(). L’oggetto originale rimane lo stesso.

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]]]]]