2014-09-23 6 views
1

값 목록 또는 숫자 배열에서 값을 numpy 배열로 효율적으로 변환하고 싶습니다. 음수 값은 새 배열에서 0이되어야하고 양수 값 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. ]) 

있습니까? 한 가지 방법은 값을 반올림하는 것입니다. 그러나 나는 긍정적 인 모든 것을 원할 것입니다. np.around()을 사용한다면 0.45 -> 0 일 것입니다.

답변

4

0보다 큰 값을 모두 1로 매핑하려면 np. where을 사용할 수 있습니다. astype('i1')가 DTYPE 0,123,096,834,731,949 배열을 반환하면서 np.where가 DTYPE int32 (4 바이트 INT)로 된 배열을 반환되었는지

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) 

참고(1 바이트 정수) 문자열로

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' 

을 또는 : 당신이 UINT8에이 이진 값을 포장하고자하는 경우

, 당신은 np.packbits를 사용할 수

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

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

니스, 감사합니다! StackOverflow 날 수 있습니다 때이 대답을 받아 들일 것입니다! – Sebastian

+1

퍼포먼스가 문제가된다면,'(a> 0) .astype ('i1')'은'np.where (a> 0, 1, 0)'보다 훨씬 빠르다는 것에주의하십시오. 그 차이는 어레이가 커질수록 커집니다. 나는 길이가 100 인 어레이의 경우 2 배 정도 빠르며 길이가 10k 인 어레이의 경우 10 배 더 빠릅니다. –

+0

메모 @ LogerFan 주셔서 감사합니다. – Sebastian

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.]) 
관련 문제