2017-07-07 75 views
2

给定一个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类似。

回答

6

完美的设置,以充分利用np.searchsorted -

np.searchsorted([0,5],x) 

这是可扩展的,纳入斌元素的通用号码。因此,笼统地说 -

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

伟大的解决方案,谢谢! –

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)