2014-09-23 35 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.])