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


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 0y=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.