Bir boole dizisini int dizisine dönüştürme


129

Scilab kullanıyorum ve bir dizi boole'yi bir tamsayı dizisine dönüştürmek istiyorum:

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

Scilab'da şunları kullanabilirim:

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

hatta 1 ile çarpın:

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

Python'da bunun için basit bir komut var mı, yoksa bir döngü kullanmam gerekir mi?


Bir boole dizisini scipy, numpy ve benzeri olmayan bir tam sayıya dönüştürmenin bir yolunu mu arıyorsunuz?
Sukrit Kalra

Kodu biçimlendirmenin ayrı bir yolu vardır. Blok alıntı kullanmak zorunda değilsiniz. Girinti yaparak yapılır ve soru düzenleyicinin üstündeki küme parantezi düğmesi bunu sizin için yapar. Bunu kontrol et.
Marcin

Sukrit, scipy, numpy veya başka bir python modülü paketi kullanmam gerekip gerekmediği umurumda değil.
Kwolf

Yanıtlar:


167

Numpy dizilerinin bir astypeyöntemi vardır. Sadece yap y.astype(int).

Diziyi ne için kullandığınıza bağlı olarak bunu yapmanın bile gerekmeyebileceğini unutmayın. Bool, birçok durumda int'e otomatik olarak yükseltilecektir, bu nedenle açıkça dönüştürmek zorunda kalmadan onu int dizilerine ekleyebilirsiniz:

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

5
evet, x * 1 de yazabilirim ... ve scilab'ın yaptığı aynı şeyi yapar .... * şimdi aptal gibi hissettiriyor * .. yardımlarınız için herkese teşekkür ederim! .... cevabı doğru olmasına rağmen soru, çeşitli yanıtlar almayı ve bunu yapmanın tüm farklı yollarını görmeyi gerçekten sevdim. Python ile ilgili aklımı gerçekten açtı.
Kwolf

Yeniden boole dizileri otomatik olarak yükseltiliyor: maalesef numpy bununla tutarlı değil. İki boole dizisini çıkarmayı deneyin ve bir TypeError ve bir kullanımdan kaldırma mesajı alırsınız.
oulenz

52

1*yYöntem çok Numpy çalışır:

>>> 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 listelerini Boolean'dan int'e dönüştürmenin bir yolunu arıyorsanız, mapbunu yapmak için kullanabilirsiniz :

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

Veya liste anlamalarını kullanarak:

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

öyleyse, y = 1 if x else 0 ile aynı y = 1 if x>0 else 0ve aynı if x: y = 1 ""NEXT LINE"" else: y = 0.... bu hileleri nasıl öğrendiniz, if ifadesi belgelerinde görmedim ?
Kwolf

Hayır y=1 if x else 0, y=1 if x>0 else 0negatif sayıları dikkate almadığından, hayır ile aynı şey değildir. Bu, Python'un tam olarak tanımladığı şeydir Trueveya Falsebunların tümü dokümantasyondadır.
Sukrit Kalra

24

Numpy kullanarak şunları yapabilirsiniz:

y = x.astype(int)

Uyuşuk olmayan bir dizi kullanıyorsanız, bir liste anlama kullanabilirsiniz :

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

14

Çoğu zaman dönüşüme ihtiyacınız yoktur:

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

Bunu yapmanın doğru yolu:

yourArray.astype(int)

veya

yourArray.astype(float)

3

Döngü olmayan çözümler istediğinizi biliyorum, ancak bulabildiğim tek çözüm muhtemelen dahili olarak döngüye girer:

map(int,y)

veya:

[i*1 for i in y]

veya:

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

evet, döngü yavaş. okuduğum kadarıyla, eğer kritik bir zamanlama yapmanız gerekiyorsa python'dan c çağırmalısınız. Bunu yapmak için herhangi bir referans biliyor musunuz? Ayrıca yardımlarınız için teşekkür ederim. herkesin ne kadar hızlı cevap verdiğini şaşırttı!
Kwolf

2

Bunu yapmanın komik bir yolu

>>> np.array([True, False, False]) + 0 
np.array([1, 0, 0])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.