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?

Kwolf
sumber
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])
BrenBarn
sumber
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]
Sukrit Kalra
sumber
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]
cjm
sumber
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)
Gioelelm
sumber
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
bsoist
sumber
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])
Thomas G.
sumber