Skip to content

numpy.arange(), linspace(): Generare ndarray con valori uniformemente spaziati

Python

numpy.arange() e numpy.linspace() generano numpy.ndarray con valori equidistanti.

La differenza è che l’intervallo è specificato per np.arange() e il numero di elementi è specificato per np.linspace().

Questo articolo descrive quanto segue:

  • Specificare l’intervallo:numpy.arange()
  • Specificare il numero di elementi:numpy.linspace()
    • Utilizzo di base
    • Includi stop o no:endpoint
    • Ottieni l’intervallo:retstep
  • Converti in ordine inverso
  • Converti in un array multidimensionale

Specificare l’intervallo:numpy.arange()

numpy.arange() è simile alla funzione interna di Python range(). Vedere il seguente articolo per gamma().

numpy.arange() genera numpy.ndarray con valori equidistanti come segue in base al numero di argomenti specificati.

  • numpy.arange(stop)
  • numpy.arange(start, stop)
  • numpy.arange(start, stop, step)
    • inizio <= n < stop (crescente per gradi)
import numpy as np

print(np.arange(3))
# [0 1 2]

print(np.arange(3, 10))
# [3 4 5 6 7 8 9]

print(np.arange(3, 10, 2))
# [3 5 7 9]

A differenza di range(), puoi specificare float come argomento per numpy.arange().

print(np.arange(0.3, 1.0, 0.2))
# [0.3 0.5 0.7 0.9]

Il comportamento con valori negativi è lo stesso di range(). Allo stesso modo, se non esiste un valore corrispondente, generi un numpy.ndarray vuoto.

print(np.arange(-3, 3))
# [-3 -2 -1  0  1  2]

print(np.arange(10, 3))
# []

print(np.arange(10, 3, -2))
# [10  8  6  4]

Il tipo di dati dtype viene selezionato automaticamente, ma è possibile specificare con l’argomento dtype.

print(np.arange(3, dtype=float))
# [0. 1. 2.]

print(np.arange(3, 10, dtype=float))
# [3. 4. 5. 6. 7. 8. 9.]

print(np.arange(3, 10, 2, dtype=float))
# [3. 5. 7. 9.]

Per ulteriori informazioni sul tipo di dati dtype in NumPy, vedere l’articolo seguente.

Specificare il numero di elementi:numpy.linspace()

Utilizzo di base

Con numpy.linspace(), puoi specificare il numero di elementi invece dell’intervallo.

Specificare il valore iniziale nel primo argomento start, il valore finale nel secondo argomento stop e il numero di elementi nel terzo argomento num. L’intervallo viene calcolato automaticamente in base a tali valori.

import numpy as np

print(np.linspace(0, 10, 3))
# [ 0.  5. 10.]

print(np.linspace(0, 10, 4))
# [ 0.          3.33333333  6.66666667 10.        ]

print(np.linspace(0, 10, 5))
# [ 0.   2.5  5.   7.5 10. ]

Gestisce correttamente anche il caso di avvio > arresta.

print(np.linspace(10, 0, 5))
# [10.   7.5  5.   2.5  0. ]

Il tipo di dati dtype viene selezionato automaticamente, ma è possibile specificare con l’argomento dtype.

print(np.linspace(0, 10, 3, dtype=int))
# [ 0  5 10]

Includi stop o no:endpoint

Per impostazione predefinita, il valore di stop è incluso nel risultato.

Se l’argomento endpoint è impostato su False, il risultato non include stop.

print(np.linspace(0, 10, 5))
# [ 0.   2.5  5.   7.5 10. ]

print(np.linspace(0, 10, 5, endpoint=False))
# [0. 2. 4. 6. 8.]

La relazione tra l’endpoint dell’argomento e il passaggio dell’intervallo è la seguente.

  • endpoint=True (predefinito)
    • passo = (fermata – partenza) / (num – 1)
  • punto finale=falso
    • passo = (fermata – partenza) / num

Ottieni l’intervallo:retstep

Se si desidera ottenere l’intervallo, impostare l’argomento retstep su True.

In questo caso, numpy.linspace() restituisce una tupla con due elementi, (numpy.ndarray, step).

result = np.linspace(0, 10, 5, retstep=True)

print(result)
# (array([ 0. ,  2.5,  5. ,  7.5, 10. ]), 2.5)

print(type(result))
# <class 'tuple'>

print(result[0])
# [ 0.   2.5  5.   7.5 10. ]

print(result[1])
# 2.5

Se vuoi controllare solo il passaggio, ottieni il secondo elemento con l’indice.

print(np.linspace(0, 10, 5, retstep=True)[1])
# 2.5

print(np.linspace(0, 10, 5, retstep=True, endpoint=False)[1])
# 2.0

Converti in ordine inverso

Con numpy.arange(), puoi ottenere un array in ordine inverso se specifichi gli argomenti correttamente, ma è problematico.

print(np.arange(3, 10, 2))
# [3 5 7 9]

print(np.arange(9, 2, -2))
# [9 7 5 3]

È facile usare slice [::-1] o numpy.flip().

print(np.arange(3, 10, 2)[::-1])
# [9 7 5 3]

print(np.flip(np.arange(3, 10, 2)))
# [9 7 5 3]

Nel caso di numpy.linspace(), puoi facilmente invertire l’ordine sostituendo il primo argomento start e il secondo argomento stop. Il risultato è lo stesso con slice [::-1] e numpy.flip().

print(np.linspace(0, 10, 5))
# [ 0.   2.5  5.   7.5 10. ]

print(np.linspace(10, 0, 5))
# [10.   7.5  5.   2.5  0. ]

print(np.linspace(0, 10, 5)[::-1])
# [10.   7.5  5.   2.5  0. ]

print(np.flip(np.linspace(0, 10, 5)))
# [10.   7.5  5.   2.5  0. ]

Converti in un array multidimensionale

Né numpy.arange() né numpy.linspace() hanno argomenti per specificare la forma. Usa reshape() per cercare in un array multidimensionale.

print(np.arange(12).reshape(3, 4))
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

print(np.arange(24).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]]]
print(np.linspace(0, 10, 12).reshape(3, 4))
# [[ 0.          0.90909091  1.81818182  2.72727273]
#  [ 3.63636364  4.54545455  5.45454545  6.36363636]
#  [ 7.27272727  8.18181818  9.09090909 10.        ]]

print(np.linspace(0, 10, 24).reshape(2, 3, 4))
# [[[ 0.          0.43478261  0.86956522  1.30434783]
#   [ 1.73913043  2.17391304  2.60869565  3.04347826]
#   [ 3.47826087  3.91304348  4.34782609  4.7826087 ]]
# 
#  [[ 5.2173913   5.65217391  6.08695652  6.52173913]
#   [ 6.95652174  7.39130435  7.82608696  8.26086957]
#   [ 8.69565217  9.13043478  9.56521739 10.        ]]]