Cách chuyển đổi mảng boolean thành mảng int


129

Tôi sử dụng Scilab và muốn chuyển đổi một mảng boolean thành một mảng các số nguyên:

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

Trong Scilab, tôi có thể sử dụng:

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

hoặc thậm chí chỉ cần nhân nó với 1:

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

Có một lệnh đơn giản cho việc này bằng Python hay tôi phải sử dụng một vòng lặp?


Bạn đang yêu cầu một cách để chuyển đổi một mảng boolean thành một số nguyên mà không có scipy, numpy và những thứ tương tự?
Sukrit Kalra

Có một cách định dạng mã riêng biệt. Bạn không cần phải sử dụng blockquote. Nó được thực hiện bằng cách thụt lề và nút ngoặc nhọn phía trên trình soạn thảo câu hỏi sẽ làm điều đó cho bạn. Kiểm tra nó ra.
Marcin

Sukrit, tôi không quan tâm nếu tôi phải sử dụng scipy, numpy hay bất kỳ gói mô-đun python nào khác.
Kwolf

Câu trả lời:


167

Mảng Numpy có một astypephương thức. Chỉ cần làm y.astype(int).

Lưu ý rằng thậm chí có thể không cần thiết để làm điều này, tùy thuộc vào những gì bạn đang sử dụng mảng. Bool sẽ được tự động khởi động thành int trong nhiều trường hợp, vì vậy bạn có thể thêm nó vào mảng int mà không cần phải chuyển đổi rõ ràng:

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

5
vâng, tôi cũng có thể gõ x * 1 ... và nó làm điều tương tự mà scilab làm .... * bây giờ cảm thấy như chết lặng * .. cảm ơn mọi người đã giúp đỡ! .... mặc dù câu trả lời đã nằm ngay trong tôi câu hỏi, tôi thực sự thích nhận được nhiều câu trả lời và xem tất cả các cách khác nhau để làm điều đó. Thực sự mở mang tâm trí của tôi về trăn.
Kwolf

Các mảng re boolean đang được khởi động tự động: thật không may, numpy không phù hợp với điều này. Thử trừ hai mảng boolean và bạn nhận được Lỗi TypeError và thông báo không dùng nữa.
oulenz

52

Các 1*yphương pháp làm việc trong NumPy quá:

>>> 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]) 

Nếu bạn đang yêu cầu một cách chuyển đổi danh sách Python từ Boolean sang int, bạn có thể sử dụng mapđể thực hiện:

>>> 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]

Hoặc sử dụng cách hiểu danh sách:

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

vì vậy, y = 1 if x else 0 giống như y = 1 if x>0 else 0và giống như if x: y = 1 ""NEXT LINE"" else: y = 0.... bạn đã học những thủ thuật đó như thế nào, tôi không thấy nó trong tài liệu câu lệnh if ?
Kwolf

Không y=1 if x else 0giống như y=1 if x>0 else 0, vì sau này không xem xét các số âm. Đây chỉ là những gì Python định nghĩa là Truehoặc False, tất cả đều có trong tài liệu.
Sukrit Kalra

24

Sử dụng numpy, bạn có thể làm:

y = x.astype(int)

Nếu bạn đang sử dụng một mảng không phải numpy, bạn có thể sử dụng khả năng hiểu danh sách :

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

14

Hầu hết thời gian bạn không cần chuyển đổi:

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

Cách làm đúng là:

yourArray.astype(int)

hoặc là

yourArray.astype(float)

3

Tôi biết bạn đã yêu cầu các giải pháp không lặp lại, nhưng dù sao thì các giải pháp duy nhất mà tôi có thể đưa ra có thể là lặp nội bộ:

map(int,y)

hoặc là:

[i*1 for i in y]

hoặc là:

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

có, vòng lặp chậm. từ những gì tôi đã đọc, nếu bạn cần thực hiện một số lần bẻ khóa quan trọng, bạn nên gọi c từ python. Bạn có biết bất kỳ tài liệu tham khảo để làm điều này? Ngoài ra, cảm ơn bạn đã giúp đỡ của bạn. ngạc nhiên vì mọi người phản ứng nhanh như thế nào!
Kwolf

2

Một cách thú vị để làm điều này là

>>> np.array([True, False, False]) + 0 
np.array([1, 0, 0])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.