根据不等式替换numpy数组中的值

时间:2017-07-07 12:19:31

标签: python arrays pandas numpy

给定一个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类似的更系统化的东西。

2 个答案:

答案 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)