使用numpy.clip将正值和负值转换为位串

时间:2014-09-23 17:15:39

标签: python arrays numpy clip

我想有效地将​​列表(或numpy数组)中的值转换为numpy位数组:新数组中的负值应为0,新数组中的值为1。

,例如,

>> 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

2 个答案:

答案 0 :(得分:3)

要将大于0的所有内容(以及少于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')返回一个dtype为int8的数组(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'

答案 1 :(得分: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.])