Como criar uma matriz numpy de todos os True ou All False?

193

No Python, como criar uma matriz numpy de forma arbitrária preenchida com todos os True ou todos os False?

Michael Currie
fonte

Respostas:

281

o numpy já permite a criação de matrizes de todos os zeros ou todos com muita facilidade:

por exemplo numpy.ones((2, 2))ounumpy.zeros((2, 2))

Como Truee Falsesão representados no Python como 1e 0, respectivamente, temos apenas que especificar que esta matriz deve ser booleana usando o dtypeparâmetro opcional e pronto.

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

retorna:

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

ATUALIZAÇÃO: 30 de outubro de 2013

Desde a versão 1.8 do numpy , podemos usar fullpara obter o mesmo resultado com sintaxe que mostra mais claramente nossa intenção (como fmonegaglia aponta):

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

ATUALIZAÇÃO: 16 de janeiro de 2017

Como pelo menos a versão numpy 1.12 , fulllança automaticamente os resultados para dtypeo segundo parâmetro, para que possamos escrever:

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

Michael Currie
fonte
37
Você respondeu sua própria pergunta no mesmo minuto em que a pergunta foi postada?
M4rtini 17/01
26
O @ M4rtini SO permite que você publique uma pergunta e uma resposta à pergunta simultaneamente.
Mick MacCallum
1
dtype = int matriz inicializada não pode ser usada para a seleção de elementos da matriz.
Jichao
1
Isso funciona. No entanto, tenha cuidado porque, como diz o @Jichao, a=np.ones((2,2))seguido de a.dtype=boolNÃO funciona.
medley56
8
Agora um meme famoso: devhumor.com/media/…
WLGfx 2/17/17
93
numpy.full((2,2), True, dtype=bool)
fmonegaglia
fonte
12
+1 Acho que essa deve ser a resposta aceita. Parece mais natural preencher uma matriz com bools do que preenchê-la com números para convertê-los em bools.
Zelphir Kaltstahl
5
As respostas onese zerosnão constroem uma matriz de números inteiros. Eles constroem uma matriz de bools diretamente.
User2357112 suporta Monica
1
É numpy.full((2,2), True)um equivalente?
Pavel
Está no numpy 1.12+. Eu não me lembro se ela se aplica a versões anteriores quer
fmonegaglia
Certamente o dtype é armazenado separadamente dos dados em si, quando possível? Eu não posso imaginar numpy fazer qualquer trabalho pesado para converter int 1para bool True.
precisa
30

onese zeros, que criam matrizes cheias de uns e zeros, respectivamente, usam um dtypeparâmetro opcional :

>>> 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)
user2357112 suporta Monica
fonte
10

Se não precisar ser gravável, você poderá criar uma matriz com 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)

Se você precisar gravá-lo, também poderá criar uma matriz vazia e fillvocê mesmo:

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

Essas abordagens são apenas sugestões alternativas. Em geral, você deve ficar com np.full, np.zerosou np.onescomo as outras respostas sugerem.

MSeifert
fonte
3

Rapidamente executou um timeit para ver se há alguma diferença entre a versão np.fulle np.ones.

Resposta: Não

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

Resultado:

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


IMPORTANTE

Em relação ao post sobre np.empty(e não posso comentar, pois minha reputação é muito baixa):

NÃO FAÇA ISSO. NÃO USE np.emptypara inicializar um Trueconjunto completo

Como a matriz está vazia, a memória não é gravada e não há garantia, quais serão seus valores, por exemplo

>>> print(np.empty((4,4), dtype=bool))
[[ True  True  True  True]
 [ True  True  True  True]
 [ True  True  True  True]
 [ True  True False False]]
Joschua
fonte
0
>>> 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 (tamanho, valor escalar, tipo). Também existem outros argumentos que podem ser passados, para documentação sobre isso, verifique https://docs.scipy.org/doc/numpy/reference/generated/numpy.full.html

Nikithashr
fonte
6
Bem, outra resposta já respondeu usando np.full- mais de um ano atrás!
MSDIFER #