recorrer data columna agregar python arrays numpy clip clamp

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