web-dev-qa-db-ja.com

All TrueまたはAll Falseのテンキー配列を作成する方法

Pythonでは、すべてTrueまたはすべてFalseで埋められた任意の形状の多数の配列を作成するにはどうすればよいですか。

160
Michael Currie

numpyはすでにすべて1またはすべて0の配列の作成を非常に簡単に可能にします。

例えばnumpy.ones((2, 2))またはnumpy.zeros((2, 2))

TrueおよびFalseはそれぞれPythonで1および0として表されるので、この配列はオプションのdtypeパラメーターを使用してブール値に指定するだけで済みます。

numpy.ones((2, 2), dtype=bool)

以下を返します。

array([[ True,  True],
       [ True,  True]], dtype=bool)

更新日:2013年10月30日

Numpy version 1.8 から、(fmonegagliaが指摘しているように)fullを使用して意図をより明確に示す構文で同じ結果を得ることができます。

numpy.full((2, 2), True, dtype=bool)

更新日:2017年1月16日

少なくともnumpy バージョン1.12 なので、fullは自動的に2番目のパラメータのdtypeに結果をキャストします。したがって、次のように書くだけです。

numpy.full((2, 2), True)

229
Michael Currie
numpy.full((2,2), True, dtype=bool)
81
fmonegaglia

それぞれ1と0で埋められた配列を作成するoneszerosは、オプションのdtypeパラメータを取ります。

>>> numpy.ones((2, 2), dtype=bool)
array([[ True,  True],
       [ True,  True]], dtype=bool)
>>> numpy.zeros((2, 2), dtype=bool)
array([[False, False],
       [False, False]], dtype=bool)
26
user2357112

書き込み可能である必要がない場合は、 np.broadcast_to を使用してそのような配列を作成できます。

>>> import numpy as np
>>> np.broadcast_to(True, (2, 5))
array([[ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True]], dtype=bool)

書き込み可能にする必要がある場合は、空の配列を作成して fill それを自分で作成することもできます。

>>> arr = np.empty((2, 5), dtype=bool)
>>> arr.fill(1)
>>> arr
array([[ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True]], dtype=bool)

これらのアプローチは単なる代替案です。他の答えが示唆するように、一般的にはnp.fullnp.zerosまたはnp.onesに固執するべきです。

10
MSeifert
>>> a = numpy.full((2,4), True, dtype=bool)
>>> a[1][3]
True
>>> a
array([[ True,  True,  True,  True],
       [ True,  True,  True,  True]], dtype=bool)

numpy.full(サイズ、スカラー値、タイプ)。他にも渡すことができる引数があります。それについては、 https://docs.scipy.org/doc/numpy/reference/generated/numpy.full.html を確認してください。

0
nikithashr

np.fullnp.onesのバージョンに違いがあるかどうかを確認するためにすぐに時間がかかりました。

回答:いいえ

import timeit

n_array, n_test = 1000, 10000
setup = f"import numpy as np; n = {n_array};"

print(f"np.ones: {timeit.timeit('np.ones((n, n), dtype=bool)', number=n_test, setup=setup)}s")
print(f"np.full: {timeit.timeit('np.full((n, n), True)', number=n_test, setup=setup)}s")

結果:

np.ones: 0.38416870904620737s
np.full: 0.38430388597771525s


IMPORTANT

np.emptyに関する投稿について(そして私の評判が低すぎるので、コメントすることはできません):

しないでください。すべてのTrue配列を初期化するためにnp.emptyを使用しないでください

配列が空なので、メモリは書き込まれず、あなたの値がどうなるかなどの保証はありません。

>>> print(np.empty((4,4), dtype=bool))
[[ True  True  True  True]
 [ True  True  True  True]
 [ True  True  True  True]
 [ True  True False False]]
0
Joschua

さらに答えを追加するために、任意の形状のブール配列を生成する別の方法があります。手順は一目瞭然です。

# desired shape
In [42]: shape = (2, 3)

In [43]: true_arr = np.empty(shape, dtype=np.bool)

# when needed an array with `False`y values, just negate the `True`thy values
In [44]: false_arr = ~np.empty(shape, dtype=np.bool)

In [45]: true_arr
Out[45]: 
array([[ True,  True,  True],
       [ True,  True,  True]], dtype=bool)

In [46]: false_arr
Out[46]: 
array([[False, False, False],
       [False, False, False]], dtype=bool)
0
kmario23