使用np.digitize 的纯 NumPy 解决方案:
import numpy as np
scores = [95, 100, 80, 42, 39, 96, 80, 69]
bins = [64, 66, 69, 72, 76, 79, 82, 86, 89, 92, 96, 100]
gpa_scale = np.array([0.0, 1.0, 1.3, 1.7, 2.0, 2.3, 2.7, 3.0, 3.3, 3.7, 4.0, 4.0])
print(repr(gpa_scale[np.digitize(scores, bins, right=True)]))
输出:
array([4. , 4. , 2.7, 0. , 0. , 4. , 2.7, 1.3])
编辑:
您也可以使用np.searchsorted,它应该更快,因为它对输入的检查更少,代码几乎相同:
import numpy as np
scores = [95, 100, 80, 42, 39, 96, 80, 69]
bins = [64, 66, 69, 72, 76, 79, 82, 86, 89, 92, 96, 100]
gpa_scale = np.array([0.0, 1.0, 1.3, 1.7, 2.0, 2.3, 2.7, 3.0, 3.3, 3.7, 4.0, 4.0])
print(repr(gpa_scale[np.searchsorted(bins, scores, side='left')]))
输出:
array([4. , 4. , 2.7, 0. , 0. , 4. , 2.7, 1.3])
复杂性:
np.digitize 和 np.searchsorted 都将二进制搜索应用于 bin 值,这会导致 O(nlogm) 最坏情况的复杂性。而 for 循环和 if 检查具有 O(nm) 最坏情况复杂性。这里n是输入的长度,m是bin的长度。