부울 배열을 정수 배열로 변환하는 방법


129

Scilab을 사용하고 부울 배열을 정수 배열로 변환하고 싶습니다.

>>> x = np.array([4, 3, 2, 1])
>>> y = 2 >= x
>>> y
array([False, False,  True,  True], dtype=bool)

Scilab에서는 다음을 사용할 수 있습니다.

>>> bool2s(y)
0.    0.    1.    1.  

또는 1을 곱하면됩니다.

>>> 1*y
0.    0.    1.    1.  

파이썬에 이것에 대한 간단한 명령이 있습니까, 아니면 루프를 사용해야합니까?


scipy, numpy 등을 사용하지 않고 부울 배열을 정수 1로 변환하는 방법을 요청하고 있습니까?
— Sukrit Kalra

코드 서식을 지정하는 별도의 방법이 있습니다. 인용구를 사용할 필요가 없습니다. 들여 쓰기로 이루어지며 질문 편집기 위의 중괄호 버튼이 자동으로 수행합니다. 확인 해봐.
— Marcin

Sukrit, scipy, numpy 또는 다른 파이썬 모듈 패키지를 사용해야하는지 상관 없습니다.
— Kwolf

답변:


167

Numpy 배열에는 astype메서드가 있습니다. 그냥하세요 y.astype(int).

배열을 사용하는 용도에 따라이 작업을 수행 할 필요가 없을 수도 있습니다. Bool은 많은 경우에 int로 자동 승격되므로 명시 적으로 변환하지 않고도 int 배열에 추가 할 수 있습니다.

>>> x
array([ True, False,  True], dtype=bool)
>>> x + [1, 2, 3]
array([2, 2, 4])

5
예, x * 1을 입력 할 수도 있습니다 ... 그리고 scilab이하는 것과 똑같은 일을합니다 .... * 지금 멍청이처럼 느껴집니다 * .. 도와 주셔서 감사합니다! .... 정답은 내 질문, 나는 다양한 답변을 얻고 그것을하는 모든 다른 방법을 보는 것을 정말 좋아했습니다. 파이썬에 대해 정말 마음을 열었습니다.
— Kwolf

자동 승격되는 부울 배열 다시 : 불행히도 numpy는 이것과 일치하지 않습니다. 두 개의 부울 배열을 빼면 TypeError와 사용 중단 메시지가 표시됩니다.
— oulenz

52

이 1*y방법은 Numpy에서도 작동합니다.

>>> import numpy as np
>>> x = np.array([4, 3, 2, 1])
>>> y = 2 >= x
>>> y
array([False, False,  True,  True], dtype=bool)
>>> 1*y                      # Method 1
array([0, 0, 1, 1])
>>> y.astype(int)            # Method 2
array([0, 0, 1, 1]) 

Python 목록을 Boolean에서 int로 변환하는 방법을 요청하는 경우 다음을 사용 map하여 수행 할 수 있습니다 .

>>> testList = [False, False,  True,  True]
>>> map(lambda x: 1 if x else 0, testList)
[0, 0, 1, 1]
>>> map(int, testList)
[0, 0, 1, 1]

또는 목록 이해력 사용 :

>>> testList
[False, False, True, True]
>>> [int(elem) for elem in testList]
[0, 0, 1, 1]

그래서, y = 1 if x else 0 과 동일 y = 1 if x>0 else 0하고 같은 if x: y = 1 ""NEXT LINE"" else: y = 0.... 당신이 그 간계를 배웠어요 어떻게 내가 그것을 보지 못했다 경우 문 문서?
— Kwolf

아니요. y=1 if x else 0는 y=1 if x>0 else 0음수를 고려하지 않기 때문에 와 동일 하지 않습니다. 이것은 파이썬이 True또는으로 정의 False하는 것입니다. 이것들은 모두 문서에 있습니다.
— Sukrit Kalra

24

numpy를 사용하여 다음을 수행 할 수 있습니다.

y = x.astype(int)

numpy가 아닌 배열을 사용하는 경우 목록 이해를 사용할 수 있습니다 .

y = [int(val) for val in x]

14

대부분의 경우 변환이 필요하지 않습니다.

>>>array([True,True,False,False]) + array([1,2,3,4])
array([2, 3, 3, 4])

이를 수행하는 올바른 방법은 다음과 같습니다.

yourArray.astype(int)

또는

yourArray.astype(float)

3

비 루핑 솔루션을 요청한 것을 알고 있지만 내가 생각 해낼 수있는 유일한 솔루션은 어쨌든 내부적으로 루프 할 수 있습니다.

map(int,y)

또는:

[i*1 for i in y]

또는:

import numpy
y=numpy.array(y)
y*1

예, 루핑이 느립니다. 내가 읽은 것에서, 당신이 시간을 중요하게 처리해야 할 필요가 있다면 파이썬에서 c를 호출해야합니다. 이 작업에 대한 참조를 알고 있습니까? 또한 여러분의 도움에 감사드립니다. 모두가 얼마나 빨리 응답했는지 놀랐습니다!
— Kwolf

2

이렇게하는 재미있는 방법은

>>> np.array([True, False, False]) + 0 
np.array([1, 0, 0])
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.