2013-07-06 53 views
62

tôi sử dụng Scilab, và muốn chuyển đổi một loạt các phép toán luận vào một mảng các số nguyên:Làm thế nào để chuyển đổi một mảng boolean để một mảng int

>>> 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ỉ nhân nó bằng 1:

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

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

+0

Bạn có yêu cầu cách chuyển đổi mảng boolean thành mảng nguyên không có scipy, gọn gàng và tương tự không? –

+0

Có một cách riêng để định dạng mã. Bạn không phải sử dụng blockquote. Nó được thực hiện bằng cách thụt lề, và nút dấu 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

+0

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

Trả lời

78

Mảng cố định có phương thức astype. Chỉ cần làm y.astype(int).

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

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

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

22

Phương pháp 1*y 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 là yêu cầu cho một cách để chuyển đổi danh sách Python từ Boolean để int, bạn có thể sử dụng map để làm điều đó:

>>> 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 danh sách comprehensions:

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

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

+0

Không. 'Y = 1 nếu x else 0' không giống với' y = 1 nếu x> 0 else 0', vì sau này không tính đến số âm. Đây chỉ là những gì Python định nghĩa là 'True' hoặc' False', đây là tất cả trong tài liệu. –

12

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 NumPy, bạn có thể sử dụng một list comprehension:

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

Tôi biết bạn yêu cầu không giải pháp -looping, nhưng các giải pháp duy nhất tôi có thể đưa ra có lẽ vòng lặp nội bộ anyway:

map(int,y) 

hay:

[i*1 for i in y] 

hay:

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

có, vòng lặp chậm. từ những gì tôi đã đọc, nếu bạn cần phải làm một số thời gian crunching 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? cũng có, cảm ơn sự giúp đỡ của bạn. ngạc nhiên khi mọi người phản ứng nhanh như thế nào! – Kwolf

4

Phần lớn thời gian bạn không cần phải chuyển đổi:

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

Cách đúng để làm điều đó là:

yourArray.astype(int) 

hoặc

yourArray.astype(float) 
Các vấn đề liên quan