我想有效地将列表(或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
答案 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.])