2016-06-01 3 views
1

정수의 numpy 부울 배열 표현을 만드는 가장 쉬운 방법은 무엇입니까? 예를 들어, 6에서 np.array([False, True, True], dtype=np.bool)으로 매핑하십시오.numpy 정수의 부울 배열 표현

+0

이 질문은 불행하게도 유용한 답변이 없습니다 : http://stackoverflow.com/questions/22773443/built-in-function-in-numpy-to-interpret-an-integer -to-an-of-boolean-values ​​ –

+0

연결된 질문에 대한 대답이 잘못되었습니다. 제가 올바르게 읽는 것이 아니라면 사과드립니다.하지만 그 질문에 대한 대답은 당신이 요구하는 것을 정확하게하는 법을 아주 깔끔하게 정리 한 것 같습니다. –

+0

@VladislavMartin 필자는 정수를'np.int8'의 배열로 변환해야합니다.이 배열은 못생긴 것이고 출력은 가장 중요한 비트를 먼저 넣고 비트를 8 개의 그룹으로 그룹화합니다. –

답변

3

n이 정수이면 표현식 (n & (1 << np.arange(int(floor(log(n, 2) + 1))))) > 0은 첫 번째 위치에 최하위 비트가있는 비트를 나타내는 부울 배열을 만듭니다. 예를 들어

,

In [224]: n = 5 

In [225]: from math import floor, log 

In [226]: n = 5 

In [227]: (n & (1 << np.arange(int(floor(log(n, 2) + 1))))) > 0 
Out[227]: array([ True, False, True], dtype=bool) 

In [228]: n = 8 

In [229]: (n & (1 << np.arange(int(floor(log(n, 2) + 1))))) > 0 
Out[229]: array([False, False, False, True], dtype=bool) 

In [230]: n = 514 

In [231]: (n & (1 << np.arange(int(floor(log(n, 2) + 1))))) > 0 
Out[231]: array([False, True, False, False, False, False, False, False, False, True], dtype=bool) 
+0

영리한! 저는 실제로'm = int (floor (log (n, 2) + 1))'을 지정하고 있습니다. 그래서이 해법은 저에게 가장 짧습니다. –

2

먼저 np.binary_repr을 사용하여 정수 값의 이진 표현을 가져옵니다. 여기서 비트 배열에 원하는 너비를 지정하십시오. 마지막으로, 그 후

>> reversed_bin_array[::-1] 
reversed_bin_array = '101' 

:이어서

>>> n = 5 
>>> bin_n = bin(n) 
'0b101' 
>>> smallest_length = n.bit_length() 
3 
>>> bin_array = np.binary_repr(5, width=smallest_length) 
bin_array = '101' 

출력 이진 스트링의 비트의 역순 : I 프로그래밍 지정된 정수를 표현하는데 필요한 비트 수를 결정하는 방법을 포함시켰다 이전에 지정된 비트 너비의 비트 배열을 가져 오려면 bitarray을 사용하십시오.

>>> bitarray('11110010') # from a string 

나는 행복 코딩이 도움이 되었으면 좋겠 : 나는 bitarray 객체가 편리 비트 배열에 저장하고 조작 할 수있는 매우 유용한 수단 것으로 나타났습니다!

+0

'np.invert'는 비트의 순서를 반대로하지 않습니다. – user2357112

+0

와우 ... 내가 뭘 생각 했니? 글쎄, 고쳐. 그게 더 좋을까 @ user2357112 –

+0

일종의,하지만 당신은 "이전 단계에서 이미 되돌릴"비트의 순서에 대한 느린 참조가 있습니다. 또한 질문자가 수동으로 너비를 지정하는 대신 필요한 최소 너비를 자동 계산하려고하며 질문자가 질문 한 NumPy 배열을 얻는 방법을 완전하게 표시해야합니다. – user2357112

1

은 아마 가장 쉬운 아니지만, 컴팩트 한 방법은

from numpy import array array([i for i in bin(5)[2:]]) == '1'

1

여기 np.binary_reprnp.fromstring 사용하여 접근 방식이다 -

np.fromstring(np.binary_repr(num), dtype=np.uint8)==49 

샘플 실행 -

In [39]: num 
Out[39]: 17 

In [40]: np.fromstring(np.binary_repr(num), dtype=np.uint8)==49 
Out[40]: array([ True, False, False, False, True], dtype=bool)