给定一个numpy数组,我想基于不等式替换它的值。例如,给定
x=np.array([0.3,7,8,-5.5,1,0.1])
我想用0替换小于0的值,0到5之间的值将替换为1,其余的将替换为2.所以我想得到:
x=np.array([1,2,2,0,1,1])
我可以使用pandas.cut
执行此操作,如下所示:
pandas.cut(pandas.DataFrame(x).iloc[:,0],[-np.inf,0,5,np.inf],labels=[0,1,2],right=False)
但我想知道是否有更直接的方法来使用numpy本身。请注意,我可以有超过3个类别,这就是为什么我在寻找与pandas.cut
类似的更系统化的东西。
答案 0 :(得分:6)
完善设置以利用np.searchsorted
-
np.searchsorted([0,5],x)
这是可扩展的,以包含通用数量的bin元素。因此,一般来说 -
bins = [0,5]
out = np.searchsorted(bins,x)
样品运行 -
In [46]: x
Out[46]: array([ 0.3, 7. , 8. , -5.5, 1. , 0.1])
In [47]: np.searchsorted([0,5],x)
Out[47]: array([1, 2, 2, 0, 1, 1])
In [55]: np.searchsorted([0,2,5],x)
Out[55]: array([1, 3, 3, 0, 1, 1])
In [60]: np.searchsorted([0,2,5,7],x)
Out[60]: array([1, 3, 4, 0, 1, 1])
答案 1 :(得分:2)
为什么不使用digitize
?
import numpy as np
x = np.array([0.3,7,8,-5.5,1,0.1])
bins = np.array([-np.inf,0,5,np.inf])
np.digitize(x, bins) - 1 # Results are 1-based index
# array([1, 2, 2, 0, 1, 1], dtype=int64)