ブール配列を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などなしで整数配列に変換する方法を求めていますか?
スクリットカラ2013

コードをフォーマットする別の方法があります。blockquoteを使用する必要はありません。これはインデントによって行われ、質問エディタの上にある中括弧ボタンがそれを行います。見てみな。
Marcin 2013

Sukrit、scipy、numpy、またはその他のpythonモジュールパッケージを使用する必要があるかどうかは気にしません。
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はこれと一致していません。2つのブール配列を減算すると、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。これらはすべてドキュメントに記載されています。
スクリットカラ2013

24

numpyを使用すると、次のことができます。

y = x.astype(int)

numpy以外の配列を使用している場合は、リスト内包表記を使用できます。

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

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

はい、ループは遅いです。私が読んだことから、時間的に重要なクランチを行う必要がある場合は、Pythonからcを呼び出す必要があります。これを行うための参照を知っていますか?また、ご協力ありがとうございます。みんながどれだけ速く反応したかに驚いた!
Kwolf 2013

2

これを行う面白い方法は

>>> np.array([True, False, False]) + 0 
np.array([1, 0, 0])
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.