Cara mengonversi larik boolean menjadi larik int


129

Saya menggunakan Scilab, dan ingin mengubah array boolean menjadi array bilangan bulat:

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

Di Scilab saya bisa menggunakan:

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

atau bahkan kalikan saja dengan 1:

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

Apakah ada perintah sederhana untuk ini dengan Python, atau apakah saya harus menggunakan loop?


Apakah Anda menanyakan cara untuk mengubah array boolean menjadi integer tanpa scipy, numpy dan sejenisnya?
Sukrit Kalra

Ada cara terpisah untuk memformat kode. Anda tidak harus menggunakan blockquote. Ini dilakukan dengan membuat indentasi, dan tombol kurung kurawal di atas editor pertanyaan akan melakukannya untuk Anda. Saksikan berikut ini.
Marcin

Sukrit, saya tidak peduli apakah saya harus menggunakan scipy, numpy atau paket modul python lainnya.
Kwolf

Jawaban:


167

Array numpy memiliki astypemetode. Lakukan saja y.astype(int).

Perhatikan bahwa bahkan mungkin tidak perlu melakukan ini, bergantung pada tujuan Anda menggunakan array. Bool akan dipromosi secara otomatis ke int dalam banyak kasus, sehingga Anda dapat menambahkannya ke array int tanpa harus mengonversinya secara eksplisit:

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

5
ya, saya juga bisa mengetik x * 1 ... dan itu melakukan hal yang sama dengan scilab .... * terasa seperti bodoh sekarang * .. terima kasih semuanya atas bantuan Anda! .... meskipun jawabannya benar di saya pertanyaan, saya sangat suka mendapatkan berbagai jawaban dan melihat semua cara berbeda untuk melakukannya. Benar-benar membuka pikiran saya tentang python.
Kwolf

Re boolean array menjadi autopromoted: sayangnya, numpy tidak konsisten dengan ini. Coba kurangi dua larik boolean, dan Anda akan mendapatkan TypeError dan pesan penghentian.
oulenz

52

The 1*yMetode bekerja di Numpy juga:

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

Jika Anda meminta cara untuk mengonversi daftar Python dari Boolean ke int, Anda dapat menggunakannya 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]

Atau menggunakan pemahaman daftar:

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

Jadi, y = 1 if x else 0 apakah sama y = 1 if x>0 else 0dan sama dengan if x: y = 1 ""NEXT LINE"" else: y = 0.... bagaimana Anda mempelajari trik-trik tersebut, saya tidak melihatnya di dokumentasi pernyataan if ?
Kwolf

Tidak. y=1 if x else 0Tidak sama dengan y=1 if x>0 else 0, karena yang terakhir tidak memperhitungkan angka negatif. Inilah yang didefinisikan Python sebagai Trueatau False, ini semua ada dalam dokumentasinya.
Sukrit Kalra

24

Menggunakan numpy, Anda dapat melakukan:

y = x.astype(int)

Jika Anda menggunakan array non-numpy, Anda dapat menggunakan pemahaman daftar :

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

14

Seringkali Anda tidak membutuhkan konversi:

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

Cara yang benar untuk melakukannya adalah:

yourArray.astype(int)

atau

yourArray.astype(float)

3

Saya tahu Anda meminta solusi non-perulangan, tetapi satu-satunya solusi yang dapat saya hasilkan mungkin secara internal:

map(int,y)

atau:

[i*1 for i in y]

atau:

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

ya, perulangannya lambat. dari apa yang telah saya baca, jika Anda perlu melakukan beberapa saat kritis, Anda harus memanggil c dari python. Apakah Anda mengetahui referensi untuk melakukan ini? juga, terima kasih atas bantuannya. terkejut betapa cepatnya semua orang menanggapi!
Kwolf

2

Cara yang lucu untuk melakukan ini adalah

>>> np.array([True, False, False]) + 0 
np.array([1, 0, 0])
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.