HOWTO · NumPy

NumPy 替换值

有三种主要方法可用于在 Python 中替换 NumPy 数组中的值:numpy.clip() 函数、numpy.minimum() 函数和索引方法。

本页内容

要替换 NumPy 数组中的值,可以使用 numpy.clip(),也可以组合 numpy.minimum() 和 numpy.maximum(),将值限制在两个边界之间。如果要按条件替换,例如“将所有大于 5 的值替换掉”,可以使用布尔索引和赋值。前两种方法会创建结果数组,不会更改输入;通过索引赋值则会更新原数组。

使用 numpy.clip() 替换 NumPy 中的值

如果要将每个值限制在下限和上限之间,可以使用 numpy.clip()。低于下限的值会变为下限,高于上限的值会变为上限。不传入 out 参数时,该函数会返回裁剪后的结果数组,输入数组保持不变。请看下面的示例:
本節中的程式碼以及顯示的標籤或輸出仍為英文。

import numpy as np

array = np.array([1, 2, 3, 4, 5, 5, 6, 7, 8, 8, 9, 9])

result = np.clip(array, 0, 5)
print(result)

输出:

[1 2 3 4 5 5 5 5 5 5 5 5]

这里,0 是下限,5 是上限。处于这两个边界之间的值保持不变,较大的值则会被限制为 5。将返回值赋给 result 后,原来的 array 仍可用于后续计算。

使用 numpy.minimum() 和 numpy.maximum() 替换 NumPy 中的值

也可以用 numpy.minimum() 和 numpy.maximum() 实现相同的两个边界。首先,numpy.minimum() 会比较数组中的每个值与 5,取较小者,从而设置上限。然后,numpy.maximum() 会比较每个中间结果与 0,取较大者,从而设置下限。这两个操作都会返回数组,因此这一操作序列也不会更改 array。
本節中的程式碼以及顯示的標籤或輸出仍為英文。

import numpy as np

array = np.array([1, 2, 3, 4, 5, 5, 6, 7, 8, 8, 9, 9])

result1 = np.minimum(array, 5)

result2 = np.maximum(result1, 0)
print(result2)

输出:

[1 2 3 4 5 5 5 5 5 5 5 5]

同时应用两个边界时,顺序很重要:先限制较大的值,再将低于下限的值抬高。将 5 和 0 替换为所需的上限和下限即可。如果只需要一个边界,可以单独使用相应的函数:用 numpy.minimum() 设置上限,或用 numpy.maximum() 设置下限。

使用 Python 数组索引方法替换 NumPy 中的值

若要按条件替换值,可以先用布尔掩码选出符合条件的元素,再通过该索引赋入替换值。当规则不是简单的一对边界时,例如要更改高于某个阈值的值,这种方法很有用。赋值会直接作用于原数组;如果需要保留原数组,请先复制一份。
本節中的程式碼以及顯示的標籤或輸出仍為英文。

import numpy as np

array = np.array([1, 2, 3, 4, 5, 5, 6, 7, 8, 8, 9, 9])

array[array > 5] = 5
print(array)

输出:

[1 2 3 4 5 5 5 5 5 5 5 5]

表达式 array > 5 会创建一个布尔掩码,其中高于 5 的值对应 True。用该掩码进行索引会选中这些元素,再赋值 5 就会原地替换它们。若要替换低于某个阈值的值,将比较符改为 <;若要匹配某个范围或其他条件,可以用 & 或 | 组合布尔比较,并将每个比较表达式分别用括号括起来。