2017-07-07 100 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)