python - data - ¿Una forma pitónica de reemplazar los valores de lista con límites superiores e inferiores(sujeción, recorte, umbral)?
agregar columna pandas (2)
Para una alternativa que no depende de numpy
, siempre puedes hacer
arr = [max(lower_bound, min(x, upper_bound)) for x in arr]
Si solo quisiera establecer un límite superior, por supuesto podría escribir arr = [min(x, upper_bound) for x in arr]
. O similarmente, si solo quisiera un límite inferior, usaría max
lugar.
Aquí, acabo de aplicar ambas operaciones, escritas juntas.
Edición: Aquí hay una explicación un poco más profunda:
Dado un elemento x
de la matriz (y suponiendo que su upper_bound
es al menos tan grande como su lower_bound
!), Tendrá uno de tres casos:
i) x < lower_bound
ii) x > upper_bound
iii) lower_bound <= x <= upper_bound
.
En el caso (i), la expresión max/min
primero se evalúa como max(lower_bound, x)
, que luego se resuelve en lower_bound
.
En el caso (ii), la expresión primero se convierte en max(lower_bound, upper_bound)
, que luego se convierte en upper_bound
.
En el caso (iii), obtenemos max(lower_bound, x)
que se resuelve en solo x
.
En los tres casos, la salida es lo que queremos.
Quiero reemplazar los esqueletos de una lista. Por eso defino un límite superior e inferior. Ahora, todos los valores por encima de upper_bound
y por lower_bound
se reemplazan con el valor de límite. Mi enfoque fue hacer esto en dos pasos usando una matriz numpy.
Ahora me pregunto si es posible hacerlo en un solo paso, ya que creo que podría mejorar el rendimiento y la legibilidad.
¿Hay una manera más corta de hacer esto?
import numpy as np
lowerBound, upperBound = 3, 7
arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr[arr > upperBound] = upperBound
arr[arr < lowerBound] = lowerBound
# [3 3 3 3 4 5 6 7 7 7]
print(arr)
Puedes usar numpy.clip
:
In [1]: import numpy as np
In [2]: arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [3]: lowerBound, upperBound = 3, 7
In [4]: np.clip(arr, lowerBound, upperBound, out=arr)
Out[4]: array([3, 3, 3, 3, 4, 5, 6, 7, 7, 7])
In [5]: arr
Out[5]: array([3, 3, 3, 3, 4, 5, 6, 7, 7, 7])