2014-09-23 91 views
1

我想將列表(或numpy數組)中的值有效地轉換爲numpy數組:一個負值應該在新數組中變爲0,並且a新陣列中的正值a 1。使用numpy.clip將正值和負值轉換爲位串

例如,

>> import numpy as np 
>> np.clip([1,2,3,-1,-2], a_min=0, a_max=1) 
array([1, 1, 1, 0, 0]) 

但是,如果我有花車在列表中,這種方法使他們的是:

>> np.clip([1,0.45,3,-1,-2], a_min=0, a_max=1) 
array([ 1. , 0.45, 1. , 0. , 0. ]) 

是否有規避這種行爲的一個好辦法嗎?一種方法是將數值四捨五入。但我希望所有正數都爲1的分配。如果我使用np.around(),則會使0.45-0> 0。

回答

4

要將大於0的所有內容映射到1(所有內容都爲0),可以使用np. where

In [25]: np.where(np.array([1,0.45,3,-1,-2]) > 0, 1, 0) 
Out[25]: array([1, 1, 1, 0, 0]) 

In [29]: (np.array([1,0.45,3,-1,-2]) > 0).astype('i1') 
Out[29]: array([1, 1, 1, 0, 0], dtype=int8) 

注意np.where正在返回DTYPE的int32(4字節整數)的陣列,而astype('i1')與D型細胞返回一個數組(1字節整數)。

如果你希望這些二進制值包成UINT8,你可以使用np.packbits

In [48]: x = np.array([1,0.45,3,-1,-2]) 

In [49]: np.packbits((x > 0).astype('i1')) 
Out[49]: array([224], dtype=uint8) 

In [50]: bin(224) 
Out[50]: '0b11100000' 

,或作爲字符串:

In [60]: np.packbits((x > 0).astype('i1')).tostring() 
Out[60]: '\xe0' 

In [62]: bin(0xe0) 
Out[62]: '0b11100000' 
+0

好的,謝謝! StackOverflow讓我可以接受這個答案! – Sebastian 2014-09-23 17:21:51

+1

請注意,如果性能是一個問題,我得到'(a> 0).astype('i1')'比'np.where(a> 0,1,0)'快得多。數組越大,差異越大。對於100長陣列,我得到的速度要快2倍,對於10k長陣列,速度要快10倍。 – 2014-09-23 17:24:33

+0

感謝@RogerFan – Sebastian 2014-09-23 18:36:38

2
In [21]: arr = np.array([1,0.45,3,-1,-2]) 

In [22]: np.ceil(arr.clip(0, 1)) 
Out[22]: array([ 1., 1., 1., 0., 0.])