วิธีการแปลงอาร์เรย์บูลีนเป็นอาร์เรย์ int


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.  

มีคำสั่งง่ายๆสำหรับสิ่งนี้ใน Python หรือฉันจะต้องใช้ลูป?


คุณกำลังขอวิธีแปลงอาร์เรย์บูลีนเป็นจำนวนเต็มโดยไม่ต้องมี scipy, numpy และสิ่งที่คล้ายกันหรือไม่?
Sukrit Kalra

มีวิธีการจัดรูปแบบโค้ดแยกกัน คุณไม่ต้องใช้ blockquote ทำได้โดยการเยื้องและปุ่มวงเล็บปีกกาเหนือตัวแก้ไขคำถามจะช่วยคุณเอง ลองดูสิ
Marcin

สุกฤษฎิ์ไม่สนหรอกว่าต้องใช้ scipy, numpy หรือ python module อื่น ๆ
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 ทำ .... * รู้สึกเหมือนโง่ตอนนี้ * .. ขอบคุณทุกคนที่ช่วย! .... แม้ว่าคำตอบจะถูกต้องในฉัน คำถามฉันชอบรับคำตอบที่หลากหลายและเห็นวิธีต่างๆในการทำ เปิดใจเกี่ยวกับ python จริงๆ
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.... คุณเรียนรู้เทคนิคเหล่านั้นได้อย่างไรฉันไม่เห็นมันในเอกสารคำสั่ง if
Kwolf

ไม่ใช่y=1 if x else 0ไม่เหมือนกับy=1 if x>0 else 0เนื่องจากตัวหลังไม่ได้นำตัวเลขเชิงลบมาพิจารณา นี่เป็นเพียงสิ่งที่ Python กำหนดTrueหรือFalseทั้งหมดนี้อยู่ในเอกสารประกอบ
Sukrit Kalra


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 จาก python คุณทราบข้อมูลอ้างอิงสำหรับการดำเนินการนี้หรือไม่? ยังขอขอบคุณสำหรับความช่วยเหลือของคุณ แปลกใจว่าทุกคนตอบเร็วแค่ไหน!
Kwolf

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.